最长回文自负串1 求长度

来源:互联网 发布:中国域名注册机构 编辑:程序博客网 时间:2024/05/16 08:56

最长回文字符串1  求长度

//回文字符:在判断时,忽略所有的标点和空格,且忽略大小写,输出保持原样

//本程序为最长字符串1,只计算 长度
//核心:开始操作前会有一个预处理,就是把所有的字符经行筛选和转换,并构造一个新字符组,把所有的字母转换成大写的字母存入到新字母组中
//然后,再一个一个的判断,这样会简单很多

#include<stdio.h>
#include<string.h>
#include<ctype.h>//isalpha,isdigit(检查参数c是否为阿拉伯数字0到9),isprint(功能:判断字符c是否为可打印字符(含空格)
//说明:当c为可打印字符(0x20-0x7e)时,返回非零值,否则返回零。) 的头文件
#define MAX 5000+10
char buf[MAX],s[MAX];
int main()
{
    int n,m=0,max=0;
    int i,j,k;
    fgets(buf,sizeof(s),stdin);//fgets头文件是string.h,stdin是 键盘输入字符将其送到控制台、输入流。
    n=strlen(buf);             //计算长度
    for(i=0;i<n;i++)           //将不计算所有的其他符号,并且把所有的字母转换成大写
    {
        if(isalpha(buf[i]))   //  isalpha(c)这个函数判断c是不是小写字母,如果是的话,那么执行下一步,转换成大写字母
        s[m++]=toupper(buf[i]);//用toupper()是将小写转换成大写(或者用s[m++]=buf[i]-'a'+'A'也可以),而tolower 是将大写转换成小写
    }
    for(i=0;i<m;i++)
    for(j=0;j<m;j++)
    {
        int ok=1;
        for(k=i;k<=j;k++)
        {
            if(s[k]!=s[i+j-k])
            ok=0;             //上面标记的是ok=1;所以在下面出现ok=0时,那么ok便不会改变成 1
        }
        if(ok && j-i+1>max)
        max=j-i+1;            //如果ok是恒等于1的,那么就说明在i~j之间,就是一个字符串,没有不符合的情况
    }
    printf("max=%d\n",max);
    return 0;
}
0 0
原创粉丝点击