105 母牛制造的回文

问题描述 :

据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛制造的奇观(最棒的回文)。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。我们将保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。

输入说明 :

一个不超过20,000个字符的文件。

输出说明 :

输出的第一行应该包括找到的最长的回文的长度。

下一个行或几行应该包括这个回文的原文(没有除去标点符号、空格), 把这个回文输出到一行或多行(如果回文中包括换行符)。如果有多个回文长度都等于最大值,输出那个前出现的。

输入范例 :

Confucius say: Madam, I'm Adam.

输出范例 :

11
Madam, I'm Adam

 

思想:保存字母的信息和对应的位置,然后遍历进行判断回文。

#include <stdio.h>
#include <string.h>

int judge(char b[],int start,int end)
{
    for(int i=0;i<end-start;i++)
    {
        if(b[start+i]==b[end-i]||b[start+i]+32==b[end-i]||b[start+i]==b[end-i]+32){
            continue;
        }else{
             return 0;
            break;
        }
    }
    return 1;
}


int main()
{
    int max = 0;
    int ms = 0;
    int me = 0;
    int i, j=0, k,l;
    int num = 0;
    char s[20020];
    int  w[20000];
    char t[20000];
    char c;
    int count = 0;
   while(c=getchar())
    {
        if(c == EOF){
            break;
        }
        s[num++]=c;
    }

    for(i = 0;i<strlen(s);i++){
        if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'){
                t[count]= s[i];
                w[count++] = i;
        }
    }

    for(i=0;i<count;i++){
        int temp  =0;
        for(j=i+1;j<count;j++){
            if(judge(t,i,j)){
                temp = j-i+1;
            }
        }
        if(temp>max){
            max = temp;
            ms = w[i];
            me  = w[i+temp-1];
        }
    }
    printf("%d\n",max);
    for(i= ms ;i<=me;i++){
        printf("%c",s[i]);
    }
}

 

posted @ 2022-03-13 14:52  梦想是能睡八小时的猪  阅读(83)  评论(0)    收藏  举报