题目数据量很小, 暴力写法完全可以, 思路简单:
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
bool isSymmetric(string a){
int len=a.length();
for (int i=0; i<=len/2; i++){
if (a[i]!=a[len-1-i]) return false;
}
return true;
}
int main(){
string str;
getline(cin, str);
int len=str.length();
for (int i=len; i>=1; i--){
for (int j=0; j+i<=len; j++){
string sub=str.substr(j,i);
if (isSymmetric(sub)){
printf("%d",i);
return 0;
}
}
}
}
但是动态规划写法最快:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxN=1010;
char s[maxN];
int dp[maxN][maxN];
int main(){
cin.getline(s, maxN);
int len=strlen(s),ans=1;
memset(dp,0,sizeof(dp));
for (int i=0; i<len; i++){
dp[i][i]=1;
if (i<len-1){
if (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);
}