Belirtilmesi:
function getLength($str)
{
//function i need
}
$str1 = 'aabbcccc';
$str2 = 'aabbccccaaaaa';
echo getLength($str1); //will get 4
echo getLength($str2); //will get 5
Herhangi bir iyi bir fikir? Şimdiden teşekkürler!
Burada biraz Regex daha hızlı ve substr
çözümler sundu yapmalıdır üzerine almak benim gibidir:
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;
}
Bu eğlenceli bir egzersiz olduğundan ve ben bunun üstüne küçük bir sınıf ekledim:
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());
}
}
$sequencer = new Sequencer;
$sequencer->parseString('aaabbbbcccccddddddeeeeeeeffffffggggghhhhiiijjk');
echo $sequencer->getMaxLength(); // 7
foreach($sequencer as $length => $sequence) {
echo "$length => $sequence\n";
}
echo $sequencer->getMaxLength(); // RuntimeException
Yinelemenin sonucu olacak
7 => eeeeeee
6 => dddddd
6 => ffffff
5 => ccccc
5 => ggggg
4 => hhhh
4 => bbbb
3 => iii
3 => aaa
2 => jj
1 => k
Sen vurdu ve kaç kere bunu isabet ettirdiğin son karakterin takip, bir anda dize bir karakter yineleme tarafından oldukça trivially bu alabilirsiniz. Ayrıca bu en büyük sayısını saklamak; Eğer farklı bir karakter vurduğunuzda, yeni bir maksimum ardışık karakter sayısı isabet olup olmadığını görmek için kontrol edin ve eğer öyleyse, mağaza bu yeni maksimum olarak. Eğer tüm dize geçtiniz zaman maksimum dönün.