初始时,存好字母,记录下每个字母在原字符串中的位置。然后暴力搜索,枚举回文中的中间位置判断回文。当然一定注意回文包含字母奇偶,需要分别进行判断。
/*
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;
}