#include<iostream> #include<vector> #include<algorithm> #include<cstring> #include<map> #include<set> #include<cstring> #include<stdio.h> using namespace std; char ch[5000]; int len; /* 把第三个的判断方法和第二个的暴力方法结合在了一起,通过了*/ int test(int i, int flag) { int temp = -1, j, ans=-1e9; if(flag == 1) { temp = 1; j = 1; while((i-j>=0) && (i+j<len) && (ch[i-j] == ch[i+j])) { j++; temp += 2; } return temp; }else { if(ch[i-1] == ch[i]) { temp = 0; j = 1; while((i-j>=0) && (i+j-1<len) && (ch[i-j] == ch[i+j-1])) { j++; temp += 2; } ans = temp; }else if(ch[i+1] == ch[i]) { temp = 0; j = 1; while((i-j+1>=0) && (i+j<len) && (ch[i-j+1] == ch[i+j])) { j++; temp += 2; } ans = max(temp,ans); } return ans; } } int main() { //FILE *fp = fopen("1.txt","r"); fgets(ch, 2000, stdin); len = strlen(ch)-1; int cur = 0, ans = 1; for(int i = 0; i < len; i++) { cur = max(test(i,0),test(i,1)); ans = max(cur, ans); } cout << ans; } /* 第二个想的暴力解决方法,但是有两个测试点过不去,不知道什么地方错了。。 int main() { //FILE *fp = fopen("1.txt","r"); fgets(ch, 2000, stdin); len = strlen(ch)-1; int cur = 0, ans = 1; for(int i = 0; i < len-1; i++) { for(int j = i+1; j < len; j++) { cur = 0; for(int k = i, l = 0; k <= j; k++, l++) { int rt = j-l, lt = i+l; if(rt == lt) { cur += 1; break; }
//因为是从两头开始比较,假如中间有不相等的,且遍历之后两端没连起来,就会出现错误,因此最好使用长度枚举。
if(rt < lt ) break;
else if (ch[rt] != ch[lt]) {
cur = 0;
break;
}
if(rt < lt || ch[rt] != ch[lt]) break;
cur += 2; } ans = max(ans,cur); } } cout << ans; } */ /*最初想到的办法,分治,我觉得算法复杂度应该是nlgn,但实际运行起来很慢 int test(int i, int flag) { int temp = -1, j, ans=-1e9; if(flag == 1) { temp = 1; j = 1; while((i-j>=0) && (i+j<len) && (ch[i-j] == ch[i+j])) { j++; temp += 2; } return temp; }else { if(ch[i-1] == ch[i]) { temp = 0; j = 1; while((i-j>=0) && (i+j-1<len) && (ch[i-j] == ch[i+j-1])) { j++; temp += 2; } ans = temp; }else if(ch[i+1] == ch[i]) { temp = 0; j = 1; while((i-j+1>=0) && (i+j<len) && (ch[i-j+1] == ch[i+j])) { j++; temp += 2; } ans = max(temp,ans); } return ans; } } int traverse(int i, int j) { if(i < 0 || j < 0) return 0; if(i > j) return 0; if(i == j) return 1; int mid = (i+j)/2; int ans = max(traverse(i,mid), traverse(i+1,j)); int p = max(test(mid,0),test(mid,1)); return max(ans,p); } int main() { FILE *fp = fopen("1.txt","r"); fgets(ch, 2000, fp); len = strlen(ch) ; cout << traverse(0, len-1); } */
原文:https://www.cnblogs.com/dcklm/p/10349792.html