前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >公共最长(连续)子串

公共最长(连续)子串

作者头像
相思不扫积久弥厚
发布2023-10-26 14:13:03
1600
发布2023-10-26 14:13:03
举报
文章被收录于专栏:用户10805953的专栏

公共最长(连续)子串

   思路很简单,动态规划就行了,设dp[i][j]为a串的0-i,b串的0-j的最长公共后缀长度。那么状态转移方程就是dp[i][j]=a[i]==b[i]?dp[i-1][j-1]:0

因为在i j为0时可能会出现dp[-1][-1]的情况,所以把dp数组后推一位,且dp数组会用到的最多就是dp[i-1][j-1],所以可以优化一下空间,把它变成一维数组从后往前dp,代码如下:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
char a[10000007],b[10000007];
int dp[10000007];
int main()
{
    while(1)
    {
        scanf("%s%s",a,b);
        int acd=strlen(a);//计算a和b字符串长度 
        int bcd=strlen(b);
        int maxn=0,jl;//maxn用来记录最长后缀,jl记录maxn出现时公共字符串位置。 
        memset(dp,0,(sizeof (int))*(bcd+1));//把dp置0,初始化。 
        for(int i=0;i<acd;i++)
        {
            for(int j=bcd-1;j>=0;j--)
            {
                dp[j+1]=a[i]==b[j]?dp[j]+1:0;//核心代码,状态转移。 
                if(maxn<dp[j+1])
                {
                    maxn=dp[j+1];//更新maxn与jl 
                    jl=i-maxn+1;
                }
            }
        }
        printf("%d\n",maxn);//输出 
        for(int i=jl;i<jl+maxn;i++)
        {
            printf("%c",a[i]);
        }
        printf("\n");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-064,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 公共最长(连续)子串
    •    思路很简单,动态规划就行了,设dp[i][j]为a串的0-i,b串的0-j的最长公共后缀长度。那么状态转移方程就是dp[i][j]=a[i]==b[i]?dp[i-1][j-1]:0
      • 因为在i j为0时可能会出现dp[-1][-1]的情况,所以把dp数组后推一位,且dp数组会用到的最多就是dp[i-1][j-1],所以可以优化一下空间,把它变成一维数组从后往前dp,代码如下:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档