思路
动态规划:一个回文子串去掉第一个字符和最后一个字符依然是一个回文子串。采用一个二维数组dp[i][j],当dp[i][j]=true表示是回文子串。
状态转移方程:dp[i][j]=dp[i+1][j-1]&&s[i]==s[j]
代码
//动态规划
class Solution {
public:
string longestPalindrome(string s) {
int len=s.length();
if(len==0) return ""; //空串
int dp[len][len];
int maxdp=-1,begin;//int end;
if(len==0) return "";
for(int i=0;i<len;i++) //单字符、双字符子串初始化
{
dp[i][i]=1; //单字符
if(i<=len-2)
{ if(s[i]==s[i+1]) //双字符
{
dp[i][i+1]=1;
}
else
{
dp[i][i+1]=0;
}
}
}
for(int i=len-1;i>=0;i--)
for(int j=len-1;j>i;j--)
{
if(j-1<i+1) continue;
if(dp[i+1][j-1]==1&&s[i]==s[j])
dp[i][j]=1;
else
dp[i][j]=0;
}
//求解
for(int i=0;i<len;i++)
for(int j=i;j<len;j++)
{
if(dp[i][j]==1&&j-i>maxdp)
{
maxdp=j-i;
begin=i;
//end=j;
}
}
string str1(s,begin,maxdp+1);
return str1;
}
};