• 【ACM】nyoj_132_最长回文子串_201308151713


     

    最长回文子串

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
     
    输入
    输入一个测试数据n(1<=n<=10);
    随后有n行,每行有一个字符串。
    输出
    输出所要求的回文子串。
    样例输入
    1
    Confuciuss say:Madam,I'm Adam.
    样例输出
    Madam,I'm Adam




    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #define MAX 5500

    char str[MAX],s[MAX];
    int a[MAX];

    int main()
    {
        int n;
        scanf("%d%*c",&n);
        while(n--)
        {
            int i,j,len1,len2,max,from,to;
            gets(str);
            len1=strlen(str);
            for(i=0,j=0;i<len1;i++)
            {
                 /*if(isalpha(str[i]))
                 {
                        if(str[i]<'a')
                        {s[j]=str[i]+32;a[j++]=i;}
                        else
                        {s[j]=str[i];a[j++]=i;}
                 }*/
                 if(isalpha(str[i]))
                 {s[j]=tolower(str[i]);a[j++]=i;}
                 //isalpha 字符函数 判断ch是否为字母,是返回 1 ,不是,返回 0 ;
                 //tolower 字符函数 将大写字母转换成小写字母
                 //toupper 字符函数 将小写字母转换成大写字母
                 //使用时都需 包含 头文件 <ctype.h>
            }
            len2=j;max=0;
           
            for(i=0;i<len2;i++)
            {
                //最长回文子串的长度为奇数 时
                for(j=0;i+j<len2&&i-j>=0;j++)
                {
                    if(s[i+j]!=s[i-j])
                    break;
                    if(2*j+1>max)
                    {
                        max=2*j+1;
                        from=i-j;
                        to=i+j;
                    }
                } 
                //最长回文子串的长度为偶数 时
                for(j=0;i+j+1<len2&&i-j>=0;j++)
                {
                    if(s[i+j+1]!=s[i-j])
                    break;
                    if(2*j+2>max)
                    {
                         max=2*j+2;
                         from=i-j;
                         to=i+j+1;
                     }
                }
            }
            for(i=a[from];i<=a[to];i++)
            printf("%c",str[i]);
            printf(" ");
        }
        return 0;
    }

    
    
  • 相关阅读:
    iOS 制作view渐变的效果CAGradientLayer
    iOS应用架构谈 view层的组织和调用方案
    xcode8 iOS10 log太多
    iOS 10 UserNotifications 框架解析
    iOS UITableViewCell 左滑删除时,修改删除按钮背景颜色,默认是红色的
    给self.navigationItem.rightBarButtonItem设置字体颜色
    iPhone屏幕尺寸、分辨率及适配
    iOS 判断输入是否全是空格
    ios 修改UItableviewcell点击时的颜色
    ios 播放语音(文字转语音) 播放音频文件 振动
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3260234.html
Copyright © 2020-2023  润新知