代码之家  ›  专栏  ›  技术社区  ›  Young

如何获取字符串中具有相同字符的最长序列的长度?

  •  1
  • Young  · 技术社区  · 16 年前

    具体说明:

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

    有什么好主意吗?

    4 回复  |  直到 16 年前
        1
  •  11
  •   VolkerK    16 年前
    function getLength($str)
    {
      if (''===$str) return 0;
      preg_match_all('!(.)\\1*!', $str, $m);
      return max(array_map('strlen', $m[0]));
    }
    
        2
  •  9
  •   ThiefMaster    16 年前
    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;
    }
    
        3
  •  4
  •   Gordon Haim Evgi    16 年前

    这是我的看法,它应该比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
    
        4
  •  2
  •   Platinum Azure    16 年前

    通过一次迭代字符串一个字符,跟踪最后一个击中的字符以及击中的次数,您可以非常轻松地得到这个结果。同时存储最大数量的字符;当您命中其他字符时,检查是否达到了新的最大连续字符数,如果达到了,则将其存储为新的最大连续字符数。当您遍历整个字符串时返回最大值。