【codeup22562】最长回文子串(dp基础题)

版权声明:转载请注明出处哦~ https://blog.csdn.net/Cassie_zkq/article/details/88321642

题目:http://codeup.cn/problem.php?cid=100000629&pid=0

解题思路:


dp[i][j]=1表示s[i]到s[j]所表示的子串是回文串,否则为0

边界:

\\dp[i][i]=1\\ dp[i][i+1]=(s[i]==s[i+1])?1:0

状态转移方程:

\dpi{120} \fn_jvn $$dp[i][j]=\left\{ \begin{array}{c} dp[i+1][j-1],s[i]==s[j] \\ 0, s[i]!=s[j]\end{array}\right. $$

本题中用到库函数,isalpha,isdigit,且输入中除了空格和标点符号外的字符还可能有数字!!

详情参考代码

ac代码:


#include <iostream>
#include <cstring>
#define maxn 5005
#define inf 2147483648
using namespace std;
typedef long long ll;
int dp[maxn][maxn];
int main()
{
    //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
    memset(dp,0,sizeof(dp));
    int pos[maxn];
    string a,b;
    getline(cin,a);
    int len1=a.size(),j=0;
    for(int i=0;i<len1;i++)
    {
        if(isalpha(a[i]))
        {
            b[j]=toupper(a[i]);
            pos[j++]=i;
        }
        else if(isdigit(a[i]))
        {
            b[j]=a[i];
            pos[j++]=i;
        }
    }
    int len2=j,ans=1,k=0;
    for(int i=0;i<len2;i++)
    {
        dp[i][i]=1;
        if(b[i]==b[i+1])
        {
            dp[i][i+1]=1;
            ans=2;
        }
    }
    for(int L=3;L<=len2;L++)
    {
        for(int i=0;i+L-1<len2;i++)
        {
            int j=i+L-1;
            if(dp[i+1][j-1]&&b[i]==b[j])
            {
                dp[i][j]=1;
                if(L>ans)
                {
                    ans=L;
                    k=i;
                }
            }
        }
    }
    for(int i=pos[k];i<=pos[k+ans-1];i++)
        printf("%c",a[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Cassie_zkq/article/details/88321642
今日推荐