题解 | #最长回文子串#
最长回文子串
https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string s; cin >> s; int n=s.size(); vector<vector<int>> dp(n,vector<int>(n,0)); for(int i=0;i<n;++i) dp[i][i]=1; int result=1; for(int i=n-1;i>=0;--i){ for(int j=i+1;j<n;++j){ if(s[i]==s[j]){ if(j-i>=2&&dp[i+1][j-1]!=0){ dp[i][j]=2+dp[i+1][j-1]; } else if(j-i<=1){ dp[i][j]=j-i+1; } result=max(result,dp[i][j]); } } } cout << result; } // 64 位输出请用 printf("%lld")
#include <cmath> #include <iostream> #include <string> using namespace std; //遍历字符串,以每个字符为中心,双指针向左右移动,获得回文串的长度。 int extend(const string& s,int left,int right){ int res=0; if(left==right) res++; else if(left>=0&&right<s.size()&&s[left]==s[right]) res+=2; else return res; --left;++right; while(left>=0&&right<s.size()&&s[left]==s[right]){ res+=2; --left;++right; } return res; } int main() { string s; cin >> s; int result=1; for(int i=0;i<s.size();++i){ result=max(result,extend(s,i,i)); result=max(result,extend(s,i,i+1)); } cout << result; } // 64 位输出请用 printf("%lld")