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

Указать:

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

Любые хорошие идеи?

 function getLength($str) { if (''===$str) return 0; preg_match_all('!(.)\\1*!', $str, $m); return max(array_map('strlen', $m[0])); } 
 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; } 

Вот мой подход к ней, который должен выполняться несколько быстрее, чем предлагаемые решения 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 

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