枚举回文数最中间的字母,然后忽略非字母(可将去除非字母的字符串单独存入一个数组)同时向左右扩展,直至出界或不相等。然后更新最大值。 要考虑回文是奇数和偶数两种情况。
/*
ID:jzzlee1
PROG:calfflac
LANG:C++
*/
#include<iostream>
#include<fstream>
#include<cstring>
#include<cctype>
#include<cstdio>
using namespace std;
ifstream fin("calfflac.in");
ofstream fout("calfflac.out");
char a[20010],b[20010];
int n,maxlength=0,beginnum=0;
int main()
{
char *p,*q,c;
p=a,q=b;
while (!fin.eof())
{
c=fin.get();
if(isalpha(c))*q++=tolower(c);
*p++=c;
}
//while(1)
//{
// c=getchar();
// if(c=='1')
// break;
// if(isalpha(c)) *q++=tolower(c);
// *p++=c;
//}
*p='\0',*q='\0';
n=strlen(b);int i,j,k,s;p=a;
//暴力搜索
for(i=0;i<n;i++)
{
j=i-1;k=i+1;s=1;
while(j>=0 && k<n && b[j]==b[k])
{
j--;
k++;
s+=2;
}
if(s>maxlength)
{
maxlength=s;
beginnum=j+1;
}
j=i;
k=i+1;
s=0;
while(j>=0 && k<n && b[j]==b[k])
{
j--;
k++;
s+=2;
}
if(s>maxlength)
{
maxlength=s;
beginnum=j+1;
}
}
for(i=0;*p;p++)
if(isalpha(*p) && i++==beginnum)
break;
fout<<maxlength<<endl;
//cout<<maxlength<<endl;
for(i=0;i<maxlength && *p;p++)
{
fout<<*p;
//cout<<*p;
if(isalpha(*p)) i++;
}
//cout<<endl;
fout<<endl;
return 0;
}