1.中心扩散
int expendCenter(string& s,int begin,int end){
int left=begin;
int right=end;
while(left>=0&&right<s.size()&&s[left]==s[right]){
left--;
right++;
}
return right-left-1;
}
string longestPalindrome(string s) {
int size=s.size();
if(size<2)return s;
int maxLen=0;
int center=0;
for(int i=0;i<size;++i){
int begin=expendCenter(s,i,i);
int end=expendCenter(s,i,i+1);
if(maxLen<max({begin,end})){
maxLen=max({begin,end});
center=i;
}
}
return s.substr(center-(maxLen-1)/2,maxLen);
}
2.动态规划

string longestPalindrome(string s) {
int size=s.size();
if(size<2) return s;
int start=0;
int maxLen=0;
vector<vector<bool> > p(size,vector<bool>(size));
for(int i=0;i<size;++i){
for(int j=0;j<=i;++j){
p[j][i]=s[i]==s[j]&&(i-j<=2||p[j+1][i-1]);
if(p[j][i]){
int len=i-j+1;
if(len>maxLen){
maxLen=len;
start=j;
}
}
}
}
return s.substr(start,maxLen);
}