最长公共子序列

博客探讨了最长公共子序列(LCS)问题,通过最优子结构和重叠子问题展示了其动态规划解决方案。介绍了当两个序列的最后一个字符匹配或不匹配时LCS长度的计算方法,并给出了递归及列表实现的示例,最后展示了一段代码输出的LCS结果。
摘要由CSDN通过智能技术生成

LCS问题陈述:

给定两个序列,求它们中最长子序列的长度。子序列是以相同的相对顺序出现的序列,但不一定是连续的。例如,“abc”,“abg”,“bdf”,“aeg”,“acefg”,…是“abcdefg”的子序列。一个长度为n的字符串有2^n-1个不同的子序列,这意味着蛮力方法的时间复杂度是O(n * 2n)注意,检查两个字符串的子序列是否相同需要O(n)时间。这种时间复杂度可以通过动态规划来提高。

例子:

输入序列“ABCDGH”和“AEDFHR”的LCS为长度为3的“ADH”。

输入序列“AGGTAB”和“GXTXAYB”的LCS是长度为4的“GTAB”。

该问题的朴素解是生成两个给定序列的所有子序列并找到最长匹配子序列。这个解的时间复杂度是指数的。让我们看看这个问题如何同时具有动态规划(DP)问题的两个重要性质。

1)最优子结构:

设输入序列为X[0..]m - 1]和Y [0 . .n-1],长度分别为m和n。让L (X [0 . .m-1], Y[0..n-1])为两个序列X和Y的LCS长度。m - 1), Y [0 . . n - 1])。

如果两个序列的最后一个字符匹配(或X[m-1] == Y[n-1]),则

L (X [0 . .m-1, Y[0..n-1]) = 1 + L(X[0..])m - 2), Y (0 . . n))

如果两个序列的最后一个字符不匹配(或者X[m-1] != Y[n-1]),则

L (X [0 . .m-1, Y[0..n-1]) = MAX (L(X[0..])

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值