2010-05-10 5 views
1

Указать:Как получить длину самой длинной последовательности с одинаковыми символами в строке?

function getLength($str) 
{ 
    //function i need 
} 
$str1 = 'aabbcccc'; 
$str2 = 'aabbccccaaaaa'; 
echo getLength($str1); //will get 4 
echo getLength($str2); //will get 5 

Есть хорошие идеи?

+0

Правильное написание «Длина». – kennytm

+0

@KennyTM, ну ладно, спасибо за исправление :) – Young

ответ

11
function getLength($str) 
{ 
    if (''===$str) return 0; 
    preg_match_all('!(.)\\1*!', $str, $m); 
    return max(array_map('strlen', $m[0])); 
} 
+0

приятный простой! – Young

+2

Умный! Я поддержал вас, но я считаю, что если вы объяснили это немного лучше (будучи немного умным и все), я (и другие) был бы признателен. – alex

8
function getLongestSequence($str) 
{ 
    $sl = strlen($str); 
    $longest = 0; 
    for($i = 0; $i < $sl;) 
    { 
     $substr = substr($str, $i); 
     $len = strspn($substr, $substr{0}); 
     if($len > $longest) 
      $longest = $len; 
     $i += $len; 
    } 

    return $longest; 
} 
+0

Aw man, вам не весело. Ты отдал его. :-( –

+0

... Но я вижу свою ошибку сейчас. Ваше решение чище, чем мое ... Я забыл strspn. Красиво сделано. +1 –

+0

спасибо за это приятное решение. – Young

2

Вы можете получить это довольно тривиальный перебор строки из одного символа в то время, следя за последний символ ты попал и сколько раз ты ударил его. Также хранят наибольшее количество таких; когда вы нажмете другого персонажа, проверьте, не набрали ли вы новый максимальный последовательный символ персонажа, и если да, сохраните его как новый максимум. Верните максимум, когда вы прошли через всю строку.

3

Вот мой взгляд на него, который должен выполнить несколько быстрее, чем Regex и substr решения предлагается:

function getLongestSequenceLength($string) 
{ 
    $longest = $i = 0; 
    $totalLength = strlen($string); 
    while($i < $totalLength) { 
     if(($length = strspn($string, $string[$i], $i)) > $longest) { 
      $longest = $length; 
     } 
     $i += $length; 
    } 
    return $longest; 
} 

И так как это было веселое упражнение я добавил немного класс по верх что:

class Sequencer extends SplMaxHeap 
{ 
    public function compare($a, $b) { 
     return parent::compare(strlen($a), strlen($b)); 
    } 
    public function key() { 
     return strlen($this->current()); 
    } 
    public function parseString($string) 
    { 
     $i = 0; 
     $totalLength = strlen($string); 
     while($i < $totalLength) { 
      $length = strspn($string, $string[$i], $i); 
      $this->insert(str_repeat($string[$i], $length)); 
      $i += $length; 
     } 
    } 
    public function getMaxLength() 
    { 
     $this->rewind(); 
     return strlen($this->top()); 
    } 
} 

Это SplMaxHeap (требуется 5.3), что означает, что вы можете перемещаться по нему, но делать это будет извлекать элементы из кучи, так он будет пустым после:

$sequencer = new Sequencer; 
$sequencer->parseString('aaabbbbcccccddddddeeeeeeeffffffggggghhhhiiijjk'); 

echo $sequencer->getMaxLength(); // 7 
foreach($sequencer as $length => $sequence) { 
    echo "$length => $sequence\n"; 
} 
echo $sequencer->getMaxLength(); // RuntimeException 

Результат итерации будет

7 => eeeeeee 
6 => dddddd 
6 => ffffff 
5 => ccccc 
5 => ggggg 
4 => hhhh 
4 => bbbb 
3 => iii 
3 => aaa 
2 => jj 
1 => k 
Смежные вопросы