初始时,存好字母,记录下每个字母在原字符串中的位置。然后暴力搜索,枚举回文中的中间位置判断回文。当然一定注意回文包含字母奇偶,需要分别进行判断。
/* ID : acmerfi1 PROG : calfflac LANG : C++ */ #include <stdio.h> #include <string.h> #define MAX 20005 int n = 0, max = 0, m = 0, left, right; int t[MAX]; char cha[MAX], chb[MAX], ch; void check(int L, int R) { while(L >= 1 && R <= m) { if(chb[L] == chb[R]) { L--; R++; } else break; } if(R - 1 - L > max) { max = R - 1 - L; left = t[L + 1]; right = t[R - 1]; } } int main() { freopen ("calfflac.in", "r", stdin); freopen ("calfflac.out", "w", stdout); memset(cha, 0, sizeof(cha)); memset(chb, 0, sizeof(chb)); memset(t, 0, sizeof(t)); while(scanf("%c", &ch) != EOF) { cha[++n] = ch; } for(int i = 1; i <= n; i++ ) // 初始化进行字母的存取,记录下每个字母在原字符串中的位置。 { if((cha[i] >= 'a' && cha[i] <= 'z') || (cha[i] >= 'A' && cha[i] <= 'Z')) { m++; if(cha[i] >= 97) chb[m] = cha[i] - 32; else chb[m] = cha[i]; t[m] = i; } } for(int i = 1; i <= m; i++) // 就回文字母个数的奇偶进行分别判断 { check(i - 1, i + 1); check(i, i + 1); } printf("%d\n", max); for(int i = left; i <= right; i++) { printf("%c", cha[i]); } printf("\n"); return 0; }