最长回文串

来源:互联网 发布:中企动力域名到期 编辑:程序博客网 时间:2024/05/17 05:13

最长回文串

  • 使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当在检查它是不是EOF后再将其转换为char值。
  • 从标准输入读取一个字符可以用getchar(),它等价于fgetc(stin)。
  • fgets(buf,MAXN,fin)将读取完整的一行放在字符数组buf中。
  • 头文件ctype.h中定义的isalpha、isdigit、isprint等可以用来判断字符的性质,而toupper、tolower等工具可以用来转换大小写。
    别人家的内容

重点在于:枚举回文串“中间”的位置i;然后不断的往外扩展,直到有字符不同。

  • 奇数:aba(i-j,i+j)
  • 偶数:abba(i-j,i+j+1)

code:

#include<stdio.h>#include<string.h>#include<ctype.h>const int MAXN=5010;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);//输入字符串    n=strlen(buf);    //p[m]保存s[i]在buf中的位置,去掉标点符号,并全部转为大写。    for(i=0;i<n;i++){        if(isalpha(buf[i])) {            p[m]=i;            s[m++]=toupper(buf[i]);        }    }//  for(i=0;i<m;i++){//      for(j=0;j<m;j++){//          int ok=1;//          for(k=0;k<j;k++){//              if(s[k]!=s[i+j-k]) ok=0;//              if(ok&&j-i+1>max) max=j-i+1;//          }//      }//  }    //枚举中间位置    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];            }        }        //偶数        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");    printf("%d\n",max);    return 0;}//输入:Confuciuss say:Madam,i'm Adam.

输入输出示例:

输入输出

原创粉丝点击