#include <algorithm>
//还看到了dp的做法,dp做法主要是要想出来如何将大问题分解小问题,这道题就是一个二维dp。
//用dp[i][j]表示以i开始,以j结束的字符串是否是回文串。
//当i=j时,dp[i][j] = (s[i] == s[i]) = true;
//当j = i + 1 时,dp[i][j] = (s[i] == s[i+1]);
//其他,dp[i][j] = (dp[i-1][j+1] && s[i]==s[j])
//动态规划
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size();
vector<vector<int> > dp(len+1,vector<int>(len+1,0));
//dp[i][j]代表从i到j-1中是否是回文串,1代表是,0代表不是
//循环的时候i从大到小循环,j从小到大循环
int maxLen = 0;
int start = 0;
int end = 0;
for(int i=len-1;i>=0;i--)
{
for(int j=1;j<=len;j++)
{
if(i==j-1)
dp[i][j]=1;
else if((i+1==j-1)&&(s[i]==s[j-1]))
dp[i][j]=1;
else
dp[i][j]=((dp[i+1][j-1])&&(s[i]==s[j-1]));
if(dp[i][j]==1)
{
if(j-i>maxLen)
{
start = i;
end = j-1;
maxLen = j-i;
}
}
}
}
return s.substr(start,end-start+1);
}
};