枚舉迴文數最中間的字母,而後忽略非字母(可將去除非字母的字符串單獨存入一個數組)同時向左右擴展,直至出界或不相等。而後更新最大值。 要考慮迴文是奇數和偶數兩種狀況。ios
/* 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; }