给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解题思路:
采用动态规划的思想,如果p[i][j]为true,那么p[i+1][j-1]也为true。
首先需要求出长度为1和长度为2的字符串,然后dp。
class Solution {
public:
string longestPalindrome(string s) {
int start=0;
int maxl=1;
//初始化长度为1和长度为2的字符串
int len=s.size();
int p[len][len]={0};
for(int i=0;i<len-1;i++)
{
p[i][i]=1;
if(i<len-1&&s[i]==s[i+1])
{
p[i][i+1]=1;
maxl=2;
start=i;
}
}
//长度为2以上的字符串
for(int maxlen=3;maxlen<=len;maxlen++)
{
for(int i=0;i<=len-maxlen;i++)
{
int j=i+maxlen-1;
if(s[i]==s[j]&&p[i+1][j-1])
{
p[i][j]=1;
if(j-i+1>maxl)
{
maxl=j-i+1;
start=i;
}
}
}
}
return s.substr(start,maxl);
}
};