classSolution{//超时public:
string longestPalindrome(string s){int len = s.size();if(len <=1)return s;
vector<vector<int>>dp(len, vector<int>(len,0));
string res = s.substr(0,1);//初始化边界for(int i =1; i < len; i++){
dp[i][i]=1;if(s[i-1]== s[i]){
dp[i-1][i]=1;
res = s.substr(i-1,2);}}//状态转移方程for(int L =3; L <= len; L++){//枚举子串长度for(int i =0; i+L-1< len; i++){//子串起始位置int j = i + L -1;//子串末端if(s[i]== s[j]&& dp[i+1][j-1]==1){
dp[i][j]=1;
res = s.substr(i, L);}}}return res;//超时}};
classSolution{//通过public:
string longestPalindrome(string s){int n = s.size();
vector<vector<int>>dp(n, vector<int>(n));
string ans;for(int l =0; l < n;++l){for(int i =0; i + l < n;++i){int j = i + l;if(l ==0){
dp[i][j]=1;}elseif(l ==1){
dp[i][j]=(s[i]== s[j]);}else{
dp[i][j]=(s[i]== s[j]&& dp[i +1][j -1]);}if(dp[i][j]&& l +1> ans.size()){
ans = s.substr(i, l +1);}}}return ans;}};
中心拓展算法
classSolution{//中心拓展算法public:
pair<int,int>expandAroundCenter(const string& s,int left,int right){while(left >=0&& right < s.size()&& s[left]== s[right]){--left;++right;}return{left +1, right -1};}
string longestPalindrome(string s){int start =0, end =0;for(int i =0; i < s.size();++i){auto[left1, right1]=expandAroundCenter(s, i, i);auto[left2, right2]=expandAroundCenter(s, i, i +1);if(right1 - left1 > end - start){
start = left1;
end = right1;}if(right2 - left2 > end - start){
start = left2;
end = right2;}}return s.substr(start, end - start +1);}};