给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
dp[i][j]表示s[i]到s[j]所表示的子串是否是回文串,是则为1,不是则为0.根据s[i]是否等于s[j],把转移情况分为:
(1)若s[i]==s[j] 若s[i+1][j-1]要么是回文子串,那么s[i]至s[j]是回文子串,dp[i][j]=dp[i+1][j-1],否则,dp[i][j] = 0。
(2)若s[i]==s[j],则s[i]至s[j]不是回文子串,dp[i][j] = 0
class Solution {
const int maxn = 1000+10;
public:
string longestPalindrome(string s) {
int dp[maxn][maxn];
int len = s.length();
int start = 0, ans = 1;
memset(dp,0,sizeof(dp));
for(int i = 0; i < len; i++)
{
dp[i][i] = 1; //长度为1的子串
if(i<len-1)
{
if(s[i] == s[i+1]) //长度为2的子串
{
dp[i][i+1] = 1;
start = i;
ans = 2;
}
}
}
for(int L = 3; L <= len; L++) //从长度为3的子串开始枚举
{
for(int i = 0; i + L - 1 < len; i++) //起点
{
int j = i + L - 1; //右端点
if(s[i] == s[j] && dp[i+1][j-1] == 1) //状态转移:
{
dp[i][j] = 1;
start = i;
ans = L;
}
}
}
return s.substr(start,ans);
}
};