以下问题的解决思路来自于刘汝佳先生的《算法竞赛入门经典》。
问题描述:
输入行数据,在其中找出最长的回文数(正着倒着是一样的)
这种方法属于中心扩展法,就是以每个字符为中心向左右分别扩展,得到最长的回文字符。
样例输入:Confuciuss say : Madam,I'm Adam.
样例输出:Madam,I'm Adam
<span style="font-size:12px;">#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 5000+10
char buf[MAXN],s[MAXN];
int p[MAXN];
int main(){
int n,m=0,max=0,x,y;
int i , j ;
fgets(buf,sizeof(s),stdin); //这里将从键盘得到一串字符,放置在缓存buf中
n = strlen(buf);
for(i=0;i<n;i++){
if(isalpha(buf[i])){ //将字符串中非字母的部分去掉,并且都换成大写,同时记录下每个字符在
p[m]=i; //buf中的位置,用p[]记录,方便在后来的输出使用
s[m++]=toupper(buf[i]);
}
}
for(i=0;i<n;i++){
for(j=0;i-j>=0 && i+j<m;j++){
if(s[i-j] != s[i+j])break; //i位置的元素不参与比较,所以这个for循环找出的是奇数回文字串
if(j*2+1 >max){
max=j*2+1;
x=p[i-j];
y=p[i+j];
}
}
for(j=0;i-j>=0 && i+j+1<m;j++){
if(s[i-j] != s[i+j+1])break; //i位置的元素也参与到比较中去,so,是偶数回文字串
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]);
}
return 0;
} </span>
就是在这里写下一些在学习工程中的想法思路。