当前位置: 首页 > 知识库问答 >
问题:

将最长公共子序列降为最长递增子序列

缑勇锐
2023-03-14

在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里:

假设您有以下序列:

S1 = {D, B, A, C, E}
S2 = {E, Z, X, D, A, Y, C}

然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中:

S3 = {4, 0, 2, 3}
// Z, X and Y in S2 where ignored

这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?

共有1个答案

熊朝
2023-03-14

给定您如何构建S3,您可以保证S3的元素指向“仅且全部”S1和S2的公共元素。

通过使用这些位置并找到最长的递增子序列,您可以确保找到的是原始S1和S2的子序列,而不仅仅是它们共有的元素的数目:

  • 它将是S1的子序列,因为S3中元素的数值编码了S1中的位置,所以S3的增子序列=S1的子序列
  • 它将是S2的子序列,因为S3元素中编码的元素与S2元素的顺序相同,所以S3的子序列=S2的子序列

因此,S3最长的递增子序列将“编码”:

  • S1的子序列
  • S2的子序列
  • 只包含S1和S2中存在的元素的序列
  • 这类子序列中最长的

即S1和S2之间的最长公共子序列

 类似资料:
  • 我正在寻找最长的常见递增子序列问题的解决方案。如果你不熟悉,这里有一个链接。LCIS 这个问题基本上可以归结为两个不同的问题。“最长公共子序列”和“最长递增子序列”。这是最长公共子序列的递归解决方案: 基于此和这里找到的一般递归公式,我一直在尝试实现该算法,以便可以使用动态规划。 显然,这并没有给出正确的解决方案。任何帮助都将不胜感激。 例如,如果我给它两个序列{1,2,4,5}和{12, 1,

  • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?

  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),

  • longestCommonSubsequence正在返回LCS的长度。代码运行良好。但我试图打印子序列的值。例如,它应该打印“acef”。但我的代码只打印“ae”<如何修复? 这是完整的代码https://pastebin.com/Sq4QMtxF

  • 我想出了一个蛮力算法来寻找两个给定字符串之间最长的公共子序列。它看起来时间复杂度为O(n^3)。它通过了我所有的测试用例,但我仍然不确定它是否会通过所有的测试用例......请让我知道这是正确的蛮力算法? 如果上面的代码不对,我要蛮力算法返回最长的公共子序列字符串,,我怎么才能做到这一点???

  • 最长增子序列是我们熟知的问题,我用耐心算法给出了一个解决方案。 我曾想过先用我的算法,然后找到长度为N的第一个序列,但不知道该怎么做。 那么,如何从随机整数序列中找到第一个最长的递增子序列呢? 我的代码段: 我的代码返回:1 2 8 第一个序列是:3 6 8 另一个例子: 我的代码正确返回:1 2 3 基本上,只要第一个最长序列与最佳最长序列相同,我的代码就能工作。但是当你有一堆相同长度的最长序列