题意
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
代码实现
方法一:
class Solution {
//定义全局
public $res = "";
public $max = 0;
//比较左右
private function diff($s, $left, $right) {
while ($left >=0 && $right < strlen($s) && $s[$left] == $s[$right]) {
if ($right - $left + 1 > $this->max) {
$this->max = $right - $left + 1;
$this->res = substr($s, $left, $right-$left+1);
}
$left--;
$right++;
}
}
/**
* @param String $s
* @return String
*/
function longestPalindrome($s) {
if (strlen($s) <= 1) return $s;
for ($i = 0; $i < strlen($s); $i++) {
$this->diff($s, $i, $i);
$this->diff($s, $i, $i + 1);
}
return $this->res;
}
}
方法二:动态规划
class Solution {
/**
* @param String $s
* @return String
*/
function longestPalindrome($s) {
if (strlen($s) <= 1) return $s;
$res = $s[0];
$max = 0;
if ($s[0] == $s[1]) {
$res = substr($s, 0, 2);
}
for ($j = 2; $j < strlen($s); $j++) {
$dp[$j][$j] = true;
for ($i = 0; $i < $j; $i++) {
$dp[$i][$j] = $s[$i] == $s[$j] && ($j - $i <= 2 || $dp[$i + 1][$j - 1]);
if ($dp[$i][$j] && $max < $j - $i + 1) {
$max = $j - $i + 1;
$res = substr($s, $i, $j - $i + 1);
}
}
}
return $res;
}
}
还不快抢沙发