分析
dp
class Solution {
public:
vector<vector<int>>f;
string longestPalindrome(string s) {
int n=s.size();
f.assign(n,vector<int>(n,true));
int start=0,count=1;
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
f[i][j]=f[i+1][j-1]&&(s[i]==s[j]);
if(f[i][j]&&count<j-i+1){
count=j-i+1;
start=i;
}
}
}
return s.substr(start,count);
}
};
中心扩散法
要么从i位置开始扩展,要么从i和i+1的位置开始扩展,将回文串的所在区间存入Pair中,最后取最大的区间值即可。
class Solution {
public:
pair<int,int> midu(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[l1,r1] =midu(s,i,i);
auto[l2,r2]=midu(s,i,i+1);
if(r1-l1>end-start)
start=l1,end=r1;
if(r2-l2>end-start)
start=l2,end=r2;
}
return s.substr(start,end-start+1);
}
};