最长回文子串【动规+马拉车两种做法】
动态规划
class Solution { public: string longestPalindrome(string s) { int begin=0; int n=s.size(); int Max=1; vector<vector<int>>dp(n,vector<int>(n)); if(n<2){ return s; } for(int i=0;i<n;i++){ dp[i][i]=1; } for(int len=2;len<=n;len++){ for(int i=0;i<n;i++){ int j=i+len-1; if(j>=n) break; if(s[i]!=s[j]){ dp[i][j]=0; } else if(len<=3){ dp[i][j]=1; } else{ dp[i][j]=dp[i+1][j-1]; } if(dp[i][j]&&len>Max){ Max=len; begin=i; } } } return s.substr(begin,Max); } };
马拉车算法
class Solution { public: string longestPalindrome(string s) { string str; string ans; int start,end; str+="$#"; for(int i=0;i<s.size();i++){ str+=s[i]; str+="#"; } str+="^"; int len=str.size(); int Max_len=-1; int id; int mx=0; int p[2009]={}; for(int i=1;i<len;i++){ if(i<mx){ p[i]=min(p[2*id-i],mx-i); } else { p[i]=1; } while(str[i-p[i]]==str[i+p[i]]){ p[i]++; } if(mx<i+p[i]){ id=i; mx=i+p[i]; } if(p[i]-1>Max_len){ Max_len=p[i]-1; start=i-p[i]+1; end=i+p[i]-1; } } for(int i=start;i<=end;i++){ if(str[i]!='#'){ ans+=str[i]; } } return ans; } };