Bir dize aynı karakterlerle uzun dizisinin uzunluğunu almak nasıl?

2 Cevap php

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!

2 Cevap

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());
    }
}

İşte bir SplMaxHeap bunu üzerinde yineleme ama bunu yaparken Heap unsurları ayıklamak anlamına gelir ki, (5.3 gerektirir), bu nedenle daha sonra boş olacaktır:

$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.