动态规划求解最长公共子序列

前言推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种...
摘要由CSDN通过智能技术生成

前言

推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各种堆、各种队列、各种列表、各种树、各种图、各种排序等等几十篇的样子。

最长公共子序列

最长公共子序列,英文为Longest Common Subsequence,缩写LCS。一个序列,如果是某两个或多个已知序列的最长子序列,则称为最长公共子序列。

另外,要注意的是最长公共子序列与最长公共子串不一样,下面看一个例子就明白。

有序列S1和S2,其中S1=hello,S2=hero。那么最长公共子序列为heo,而最长公共子串为he。可以看到区别就在于一个允许不连续,一个要求必须连续,而共同特点就是都要保持顺序性。

暴力穷举法

暴力穷举法是最简单粗暴且直观的解决方法,既然是暴力了那效率肯定是最差。有640?wx_fmt=png640?wx_fmt=png两个序列,穷举过程首先要枚举所有可能的子序列,对于序列X,它的子序列数量达2^m,因此这部分的时间复杂度达到640?wx_fmt=png。而每个子序列去匹配序列Y的时间复杂度为640?wx_fmt=png,所以整个过程的时间复杂度为640?wx_fmt=png。也就是说暴力穷举法的时间复杂度达到指数级,而实际中序列长度可能较长,这时几乎无法使用该方法。

子序列的数量为何是2^m?某个序列的所有子序列可以看成是从某序列中移除若干个(0到m个)元素后组成的序列,比如ABC,移除0个元素时为{ABC},移除1个元素时为{BC,AC,AB},移除2个元素时为{C,B,A},移除3个元素时为空。

暴力穷举大致步骤:

  1. 对于序列X,枚举所有子序列;

  2. 对第1步中每个子序列匹配序列Y,记录匹配上的最长子序列;

动态规划

鉴于暴力穷举法的时间复杂度太大,需要另外一种方法解决该问题,动态规划。一般在能用动态规划解决的问题需要符合三个特征:最优子结构、重叠子问题和无后效性。刚刚好,最长公共子序列问题符合动态规划特征,下面对该问题具体分析。

最优子结构

假设有640?wx_fmt=png640?wx_fmt=png两个序列,记X、Y两个序列对应的最长公共子序列为640?wx_fmt=png,确定640?wx_fmt=png的过程就是一个最优化问题。为了分析最优子结构,我们需要从序列X与序列Y的最后一个元素开始。分两种情况:

  • 如果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值