Java算法:求两个字符串的最长公共子序列问题

最长公共子序列问题: 给定两个字符串A、B,求A与B的最长公共子序列(子序列不要求是连续的) 

举例: 

字符串A: abcdef 

字符串B:cd12334 

输出:cd

解题思路

这个问题是动态规划的问题,可以用动态规划表来进行求解

dp[i][j]:定义为a串第i位置b串第j位置以前的两个序列的最大的LCS,那么显而易见,dp[0][0]=0,dp[n][m]就是我们要求的最大值

状态转移方程:

1.a[i]=b[j]   dp[i][j]=dp[i-1][j-1]+1  

2.a[i]!=b[j]   dp[i][j]=max(dp[i-1][j],dp[i][j-1])

ps:当 i , j 位置的字符串相同的时候,我们i ,j 位置的值就是以前的LCS位置(i-1,j-1)加1

        当I ,j的字符串不相同时候,LCS的长度不会增加,但是我们有两种选择,就是i,j-1位置和i,j-1位置的值,我们选取最大的LCS作     为当前的LCS即可

动态规划

核心代码

for(int i=1;i<=n;i++){

    for(int j=1;j<=m;j++){

        if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;

        else dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);

    }

}


代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,618评论 0 18
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,886评论 0 2
  • 文:不会说谎的小丑 01 老人说:风来了,雨也要来了。 他独坐在小屋旁,嘈杂的车流,宽敞的道路被机械占领,人们都害...
    啞白先生阅读 830评论 0 2
  • 1、数字证书认证机构(Certificate Authority,简称CA)生成一对公/私钥; 2、服务器将自己的...
    leo_xl阅读 230评论 0 0
  • 一 雨,滴不完的愁绪 伴着泪水,流进心里 风,吹不尽的思绪 和着百花,芬芳我心 二 墙脚的你 微...
    DominicWang阅读 415评论 0 0

友情链接更多精彩内容