達成する[バックル] leetcode力PHP:5最長回文ストリング

トピック:

文字列を与えられた  s見つけるために、  s 最も長いサブストリングパリンドロームを。あなたは、と仮定することができる  s 1000年の最大の長さ。

例1:

入力:「Babad」
 出力:「BAB」
 注:「ABA」は有効な答えがあります。

例2:

入力: "cbbd"
 出力: "BB"

ソリューション:

class Solution
{
    /**
     * @param String $s
     * @return String
     */
    function longestPalindrome($s)
    {
        $len = strlen($s);
        if ($len < 2) return $s;         //初始化判断
        $str = '^#' . implode('#', str_split($s)) . '#$';   //分割字符串,使奇偶性统一
        $len = strlen($str);            //计算改好的字符串长度
        $r = array_fill(0, $len, 0);    //初始化半径数组
        $center = $maxRight = 0;        //初始化偏移量:中心点和回文串最大右点
        $maxStr = '';                   //结果,最长的回文串
        for ($i = 1; $i < $len; ++$i) {
            if ($i < $maxRight) {
                $r[$i] = min($maxRight - $i, $r[2 * $center - $i]);    //计算当前回文路径的长度
            }
            while ($str[$i - $r[$i] - 1] == $str[$i + $r[$i] + 1]) {    //扩展回文子串南京
                $r[$i]++;
            }
            if ($i + $r[$i] > $maxRight) {  //如果超出最右的点,则更新中心点和右节点
                $maxRight = $i + $r[$i];
                $center = $i;
            }
            if (1 + 2 * $r[$i] > strlen($maxStr)) {       //计算当前回文子串是否大于记录的结果
                $maxStr = substr($str, $i - $r[$i], 2 * $r[$i] + 1);
            }
        }
        return str_replace('#', '', $maxStr);
    }
}

 

公開された67元の記事 ウォン称賛85 ビュー340 000 +

おすすめ

転載: blog.csdn.net/Alen_xiaoxin/article/details/104546378