class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
if(n<2) return s;
vector<vector<bool>> dp(n,vector<bool>(n,false));
for(int i=0;i<n;i++){
dp[i][i]=true;
}
int maxLen=1;
int loc=0;
for(int L=2;L<=n;L++){
for(int i=0;i<=n-1-L+1;i++){
int j=i+L-1;
if(s[i]!=s[j]){
dp[i][j]=false;
}
else{
if(j-i<3){
dp[i][j]=true;
}else{
dp[i][j]=dp[i+1][j-1];
}
}
if(dp[i][j] && j-i+1>maxLen){
maxLen=j-i+1;
loc=i;
}
}
}
string res="";
for(int i=loc;i<loc+maxLen;i++){
res+=s[i];
}
return res;
}
};
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
vector<vector<bool>> dp(n,vector<bool>(n,true));
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
dp[i][j]=(s[i]==s[j]) && dp[i+1][j-1];
}
}
int maxLoc=0;
int maxLen=1;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(dp[i][j] && j-i+1>maxLen){
maxLen=j-i+1;
maxLoc=i;
}
}
}
return s.substr(maxLoc,maxLen);
}
};
从后到前遍历是为了让每一次遍历时所需用到的子串提前被计算过。