Вот мой взгляд на него, который должен выполнить несколько быстрее, чем 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
Правильное написание «Длина». – kennytm
@KennyTM, ну ладно, спасибо за исправление :) – Young