最短的公共超序列是其中两个给定序列的每个元素都存在的序列。换句话说,我们可以说给定的两个字符串都是最短公共超序列的子序列。
当两个字符串中没有公共字符时,我们可以简单地将它们连接起来以获得超序列。但是,当它们具有一些公共字符时,首先我们必须找到最长的字符串,然后在另一个字符串中添加额外的字符。
Input: Two strings. “ABCDEF” and “XYDEF” Output: The length of the shortest common super-sequence. Here the super-sequence is “ABCDEFXY”. So the length is 8.
superSeq(str1, str2)
输入:两个字符串str1和str2。
输出:查找超序列的长度。
Begin m := length of str1 n := length of str2 define table named seqTab of size (m+1 x n+1) for i := 0 to m, do for j := 0 to n, do if i = 0, then seqTab[i, j] := j else if j = 0, then seqTab[i, j] := i else if str1[i-1] = str2[j-1], then seqTab[i, j] := 1 + seqTab[i-1, j-1] else seqTab[i, j] := 1 + minimum of seqTab[i-1, j] and seqTab[i, j-1] done done return seqTab[m, n] End
#include<iostream> using namespace std; int min(int a, int b) { return (a<b)?a:b; } int superSeq(string str1, string str2) { int m = str1.size(); int n = str2.size(); int supSeqTable[m+1][n+1]; for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (!i) supSeqTable[i][j] = j; //shortest supersequence length is j else if (!j) supSeqTable[i][j] = i; //shortest supersequence length is i else if (str1[i-1] == str2[j-1]) supSeqTable[i][j] = 1 + supSeqTable[i-1][j-1]; else supSeqTable[i][j] = 1 + min(supSeqTable[i-1][j], supSeqTable[i][j-1]); } } return supSeqTable[m][n]; } int main() { string first = "ABCDEF"; string second = "XYDEF"; cout << "Length of the shortest supersequence is " << superSeq(first, second); }
输出结果
Length of the shortest supersequence is 8
longestCommonSubsequence正在返回LCS的长度。代码运行良好。但我试图打印子序列的值。例如,它应该打印“acef”。但我的代码只打印“ae”<如何修复? 这是完整的代码https://pastebin.com/Sq4QMtxF
我想出了一个蛮力算法来寻找两个给定字符串之间最长的公共子序列。它看起来时间复杂度为O(n^3)。它通过了我所有的测试用例,但我仍然不确定它是否会通过所有的测试用例......请让我知道这是正确的蛮力算法? 如果上面的代码不对,我要蛮力算法返回最长的公共子序列字符串,,我怎么才能做到这一点???
我目前正在尝试为2个给定字符串查找和打印最长的公共子序列。我使用最常见的算法,没有递归。如果我保留整个数组,这是一项简单的任务,但我正在尝试对其进行一点优化,只使用2行,您可以在下面的代码中看到。有了这个更改,查找长度仍然很简单,工作正常,但恢复子序列不再那么容易了。我尝试了几种方法,但都不起作用。下面你可以看到我最后的尝试。虽然它适用于相同的情况,但也有失败的情况。经过长时间的思考,我开始相信没
问题描述 什么是最长公共子序列呢?好比一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 举个例子,如:有两条随机序列,如 1 3 4 5 5 ,and 2 4 5 5 7 6,则它们的最长公共子序列便是:4 5 5。 分析与解法 解法一 最容易想到的算法是穷举搜索法,即对X的每一个子序列,检查它是否也是Y的子序列,从而确定它是
我正在复习在寻找两个等长字符串的最长公共子序列的上下文中讨论动态规划的笔记。有问题的算法输出长度(而不是子字符串)。 所以我有两个字符串,说: S=ABAZDC,T=BACBAD 最长的公共子序列是ABAD(子字符串不必是相邻的字母) 算法如下,其中LCS[i,j]表示S[1..i]和T[1..j]的最长公共子序列: 我的笔记声称你可以填写一个表格,其中每个字符串都沿着一个轴写。比如: B A C
一个序列中去掉若干(也可以不去掉)元素剩下的部分称为其子序列。对于给定的序列X = <x1,x2,…,xm>,称序列Z = <z1,z2,…,zk>为X的一个子序列,仅当在X中存在一个递增序号序列<i1,i2,…,ik>,对所有的j(1,2,…,k)满足 xij= z j。例如,Z = <a,b,f,c>是X = <a,b,c,f,b,c> 的一个子序列,X中相应的序号序列为 <1,2,4,6>
在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里: 假设您有以下序列: 然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中: 这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?
然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?