【问题标题】:Longest Subsequence problem if the lengths are different长度不同时的最长子序列问题
【发布时间】:2019-11-01 16:59:01
【问题描述】:

让输入序列分别为X[0..m-1]Y[0..n-1],长度分别为mn。并让L(X[0..m-1], Y[0..n-1]) 是两个序列XY 的 LCS 的长度。以下是L(X[0..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-2])

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

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

如果长度不同,如何解决问题?以及如何打印相应的序列

【问题讨论】:

  • 您刚刚描述了解决问题的算法?字符串的长度实际上并不重要。
  • 我不知道最长公共子序列问题的标准算法要求两个序列具有相同的长度。
  • 这两个字符串不是公共子序列;它们不匹配,并且会使算法失败。您还提到“如何打印相应的子序列” - 您没有,因为两者是相同的。您打印生成的单个值。
  • 如何打印最长的公共子序列??

标签: python algorithm time-complexity dynamic-programming space-complexity


【解决方案1】:

输入字符串的长度是否相同并不重要,这由递归的基本情况来处理。

if (m == 0 || n == 0) 
    return 0; 

如果我们到达任何一个字符串的末尾,递归就会停止并从那里展开。

还有你在评论中提到的例子:

ABCEFGABXDE 首先我们比较两个字符串的最后一个字符。在这种情况下,它们并不相同。

所以我们尝试两种情况:

  • 从第一个字符串中删除最后一个字符并将其与第二个字符进行比较。
  • 从第二个字符串中删除最后一个字符并与第一个比较。

并返回两种情况的最大值。

(附带说明,如果最后一个字符匹配,我们将在答案中加 1 并从两个字符串中删除最后一个字符)

这个过程一直持续到任何一个字符串到达​​它的结尾,在这种情况下,你的递归的基本情况得到满足并且递归返回。

所以字符串的原始长度是否相同并不重要。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2018-12-01
    • 2021-04-28
    相关资源
    最近更新 更多