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

题目: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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值