一、题目
给你一个字符串 s,找到 s 中最长的回文子串。
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
二、题解
1.代码
class Solution {
public:
int Max(int a,int b,int c){
return max(max(a,b),c);
}
string longestPalindrome(string str) {
int len=str.length();
if(len==1)return str;
int dp[len][len];
//maxlen记录目前最长的回文子串的长度
int maxlen=-1;
//记录目前最长的回文子串的i
int ansi=0;
//记录目前最长的回文子串的j
int ansj=0;
int temp=1;
for(int i=0;i<len;i++){
for(int j=0;j<=i;j++){
dp[i][j]=1;
}
}
for(int i=len-2;i>=0;i--){
for(int j=len-temp++;j<len;j++){
//str[i],str[j]字符相等,这时需要看str[i+1 ... j-1]是否是回文子串
if(str[i]==str[j]){
//str[i+1 ... j-1]是回文子串,则str[i ... j]也是回文子串。
if(dp[i+1][j-1]==1){
dp[i][j]=1;
//判断这个回文子串的长度是否是最长的回文子串长度。是的话更新左右两端坐标
if(j-i+1>maxlen){
maxlen=j-i+1;
ansi=i;
ansj=j;
}
}
else {
dp[i][j]=0;
}
}
//str[i],str[j]不相等,说明str[i ... j]肯定不是回文子串
else{
dp[i][j]=0;
}
}
}
return str.substr(ansi,ansj-ansi+1);
}
};
2.思路
这一题与516.最长回文子序列不太一样,求最长回文子序列时当str[i]==str[j],最长回文子序列可以直接更新,因为子序列不必是连续的。而最长回文子串却要求是连续的。
所以当str[i]==str[j],还需要考虑str[i+1 … j-1]是否是回文子串。
用dp[i][j]表示str[i… j]是否是回文子串:
- dp[i][j]=1表示str[i … j]是回文子串
- dp[i][j]=0表示str[i … j]不是回文子串
遍历方向,还是按照子序列那一题的方向
总结
子串必须是连续的,子序列却不一定