思路:动态规划 dp[i][j]表示i和j之间的最长回文子串长度
- dp[i][i]=1, 如果s[i-1]==s[i],dp[i-1][i]=2;
- 查找长度为3~s.length()的回文子串
- 对子串的每个字符i进行查找
class Solution {
public:
string longestPalindrome(string s) {
vector<vector<int>> dp(s.length(),vector<int>(s.length()));
int start=0, maxlen=1;
for(int i=0;i<s.length();i++)
{
dp[i][i]=1;
if(i!=0 && s[i]==s[i-1])
{
dp[i-1][i]=1;
start=i-1;
maxlen=2;
}
}
//从回文串长度为i=3-l进行判断;
//令j=0~总长度-i,查找是否有 s[j:j+i]为回文串
for(int i=3;i<=s.length();i++) //回文的长度
{
for(int j=0;j<=s.length()-i;j++)
{
int end=j+i-1;
dp[j][end]=dp[j+1][end-1] && s[j]==s[end];
if(dp[j][end])
{
start=j;
maxlen=i;
}
}
}
return s.substr(start,maxlen);
}
};