zoukankan      html  css  js  c++  java
  • 最长回文子串 南邮NOJ 1100

    最长回文子串

    时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
    总提交 : 689            测试通过 : 229 

    题目描述

    输入一个字符串,求出其中最大的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。


    输入

    输入字符串长度不超过5000,且占据单独的一行。

    输出

    输出最长的回文串,如果有多个,输出起始位置最靠左的。

    样例输入

    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);
        n=strlen(buf);
        for(i=0;i<n;i++)
        {
            if(isalpha(buf[i]))
            {
                p[m]=i;
                s[m++]=toupper(buf[i]);
            }
        }
        for(int 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("
    ");
        return 0;
    }
    </span>

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    django6
    django5
    欧拉回路
    消耗战合集
    小技巧
    (广义)圆方树
    最小割树(Gomory-Hu Tree)
    fhq treap
    注意!!
    急需学习的东西
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965610.html
Copyright © 2011-2022 走看看