两种做法:双指针和动态规划
双指针,分奇数对称串和偶数对称串:
#include<bits/stdc++.h>
using namespace std;
string s;
int sym(int l,int r){
while(l>=0&&r<s.size()&&s[l]==s[r]){
l--;
r++;
}
return r-l-1;
}
int main(){
getline(cin,s);
int ans=1;
for(int i=0;i<s.size()-1;i++){
int odd = sym(i,i); //奇数情况
int even = sym(i,i+1); //偶数情况
ans=max(ans,max(odd,even));
}
cout<<ans;
}
动态规划,dp[i][j]表示从i到j的串是否是对称串,代码来源柳神:
#include <iostream>
using namespace std;
int dp[1010][1010];
int main() {
string s;
getline(cin, s);
int len = s.length(), ans = 1;
for(int i = 0; i < len; i++) {
dp[i][i] = 1;
if(i < len - 1 && s[i] == s[i+1]) {
dp[i][i+1] = 1;
ans = 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;
ans = L;
}
}
}
printf("%d", ans);
return 0;
}