给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
看了B站ACM大佬的视频,豁然开朗,按照DP解法四步走:
首先定义bool型数组用来记录,以i为左下标,j为右下标中间的字串是否为回文子串
确定状态:最大回文子串的长度可以是1~整个字符串的长度
转移方程:若s[i]~s[j]为回文子串,则s[i+1]~s[j-1]也一定为回文子串,反过来,若s[i]==s[j],即判断s[i+1]~s[j-1]是否为回文子串即可。
初始条件:判定数组仅用到上三角区域,判定数组的对角线元素均为true,表示每个当都字符都是一个回文子串
计算顺序:从左到右,从上到下,从最长回文子串的程度为2到最大程度
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==1)
return s;
bool a[1000][1000]={false};
for(int i=0;i<len;i++)
a[i][i]=true;
int start=0,max=1;
for(int L=2;L<=len;L++){
for(int left=0;left<len;left++){
int right=left+L-1;
if(right>=len)
break;
if(s[left]!=s[right])
a[left][right]=false;
else{
if(right-left<=2)
a[left][right]=true;
else
a[left][right]=a[left+1][right-1];
}
if(a[left][right]&&right-left+1>max){
start=left;
max=right-left+1;
}
}
}
return s.substr(start,max);
}
};
结果如下:
![](https://img-blog.csdnimg.cn/img_convert/65e63d6349559be13618bd7a163e459c.png)