码迷,mamicode.com
首页 > 其他好文 > 详细

最长回文子串

时间:2021-02-03 10:58:22      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:false   cin   必须   符号   输出   问题   最大   amp   判断   

首先解决“判断时忽略标点,输出进却要按原样”的问题?

可以用一个简单的方法:构造一个新字符串,不包含原来的标点符号,而且所有字符变成小写(顺便解决了大小写的问题)。

由于在求最大值时,不知道s[i]和s[j]在原串中的位置。因此,必须增加一个数组pos,用pos[i]保存s[i]在原串中的位置。

const int N=5010;
bool f[N][N];
string a,b;
int pos[N],cnt;

bool check(char c)
{
    if(isdigit(c)) return true;
    if(islower(c)) return true;
    if(isupper(c)) return true;
    return false;
}

int main()
{
    getline(cin,a);

    for(int i=0;i<a.size();i++)
    {
        if(check(a[i]))
        {
            if(isupper(a[i])) b+=tolower(a[i]);
            else b+=a[i];
            pos[cnt]=i;
            cnt++;
        }
    }

    int l=0,r=0;
    for(int i=cnt-1;i>=0;i--)
        for(int j=i;j<cnt;j++)
        {
            if(i == j) f[i][j]=true;
            else if(i+1 == j) f[i][j]=(b[i] == b[j]);
            else f[i][j]=f[i+1][j-1] && (b[i] == b[j]);

            if(f[i][j] && j-i+1 > r-l+1) l=i,r=j;
        }

    int len=pos[r]-pos[l]+1;
    cout<<a.substr(pos[l],len)<<endl;

    //system("pause");
    return 0;
}

最长回文子串

标签:false   cin   必须   符号   输出   问题   最大   amp   判断   

原文地址:https://www.cnblogs.com/fxh0707/p/14363836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!