给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-de-hui-wen-zi-chuan-phpzhong-xin-kuo-san/
计算两次,1.以一个字符为中心扩散;2.以(1.)的第2个字符为中心扩散
class Solution {
/**
* @param String $s
* @return String
*/
function longestPalindrome($s) {
$str_len = strlen($s);
if ($str_len <= 1) return $s;
$start = 0; //开始截取位
$offset = 0; //长度
for ($i = 0; $i < $str_len; $i ++) {
$len1 = $this->centerExpand($s, $str_len, $i, $i);
$len2 = $this->centerExpand($s, $str_len, $i, $i + 1);
if ($len1 > $len2 && $len1 > $offset) {
// 开始位置 = 当前坐标-回文长度的一半位置
$start = $i - ($len1 - 1)/2;
$offset = $len1;
}
if ($len1 <= $len2 && $len2 > $offset) {
// 开始位置 = 回文长度的一半位置
$start = $i - $len2/2 + 1;
$offset = $len2;
}
}
return substr($s, $start, $offset);
}
// 中心扩散
function centerExpand($str, $len, $left, $right)
{
while ( $left >= 0 && $right < $len && $str[$left] == $str[$right] ) {
$right ++;
$left --;
}
return $right - $left - 1;
}
}
// longestPalindrome();