给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路:
区间DP
如果一个问题能够先计算小区间,再从小区间枚举到大区间,就可以使用区间DP
在这道题中,我们可以使用一个二维数组,存储字符串区间是否是回文串
dp[i,j]代表s[i....j]是否是回文
那么状态转移就是:如果一个区间是回文串,只要在这个区间的前后两个字母相等,那么新的区间就是回文串
子问题 dp[i+1,j-1]==true && s[i]==s[j] --> dp[i,j]=true
代码:
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
if(n==0) return "";
//区间DP dp[i,j]代表s[i..j]是否是回文
//子问题dp[i+1,j-1]==true && s[i]==s[j] --> dp[i,j]=true
vector<vector<bool> > dp(n,vector<bool>(n,false));
int start=0,end=0;
//遍历dp计算数组 i代表区间长度
for(int i=1; i<=n;i++)
{
//j代表区间起点
for(int j=0; j<n; j++)
{
int l = j;
int r = j+i-1;
if( r >= n ) break;
if( i == 1 )
{
dp[l][r] = 1;
continue;
}
if(s[l]==s[r] && (i == 2 || dp[l+1][r-1]) )
{
dp[l][r] = true;
start = l;
end = r;
}
}
}
return s.substr(start,end-start+1);
}
};