算法竞赛_最长回文子串(含特殊符号输出)_C++

样例输入:

Confuciuss say: Madam, I'm Adam.

样例输出:

Madam,I'm Adam

说明:
枚举回文串的中间位置i, 然后不断往外扩展,直到有字符不同。
长度为奇数和偶数的处理不同。
使用了fgets()函数读取完整的一行。

#include <bits/stdc++.h>

#define MAXN 5000+10

using namespace std;

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(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");
    return 0;
}
阅读更多
换一批

没有更多推荐了,返回首页