样例:
Input:
Confuciuss say:Madom,I’m Adam.
Output:
Madam,I’m Adam.
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 5000+10
char buf[MAXN],s[MAXN];
int p[MAXN];
//用P[i]来保存s[i]在buf中的位置
int main()
{
int n,m=0,max=0,x,y;
int i,j,k;
fgets(buf,sizeof(s),stdin);
//读取完整的一行储存在字符数组buf中;
//该调用从标准输入流 stdin(也就是键盘输入)
//读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中
n=strlen(buf);
for(i=0;i<n;i++)
{
if(isalpha(buf[i]))
{
p[m]=i;//用P[i]来保存s[i]在buf中的位置
s[m++]=toupper(buf[i]);
}
//isalpha 判断buf[i]是否为数组 toupper返回大写字母 头文件:ctype.h;
//同时m保存字母数;
}
/*
//枚举回文串的起点和终点并判断是否为回文串;
for(i=0;i<m;i++)
{
for(j=i;j<m;j++)
{
//判断s是否为回文串
int ok=1;
//引入变量 ok 参与判断
for(k=i;k<=j;k++)
{
if(s[k]!=s[i+j-k]) ok=0;
}
if(ok&&j-i+1>max) max=j-i+1;
//利用“当前最大值”变量 max 来保存当前发现的最长回文串的长度;
}
}
printf("max=%d\n",max);
*/
//上述代码可获得最长回文串长度;
//由于字符可多达5000个,由生成一个5000个字符'a'的字符串可以发现程序效率会太低,运行速度过慢
//则我们可以枚举回文串的额中间位置'i'然后不断向外扩展,知道有字符不同;
//长度为奇数和偶数的回文串的处理方式是不同的;
for(i=0;i<m;i++)
{
for(j=0;i-j>0&&i+j<m;j++)
{
if(s[i-j]!=s[i+j])break;
if(j*2+1>max)
{
max=j*2+1;
x=p[i-j];
y=p[i+j];
//在更新max的同时把p[i]和p[j]分别保存在x,y中,最后输出buf[x]和buf[y]中的所有字符;
}
}
for(j=0;i-j>=0&&i-j+1<m;j++)
{
if(s[i-j]!=s[i-j+1]) break;
if(j*2+2>max)
{
max=j*2+2;
x=p[i-j];
y=p[i+j+1];
}
}
}
for(i=x;i<=y;i++)
{
printf("%c",buf[i]);
}
printf("\n");
return 0;
}