最短的常见SuperSequence

时间:2016-12-25 20:48:41

标签: string algorithm dynamic-programming discrete-mathematics lcs

问题是给定2个字符串X和Y,我们需要找到最短序列Z的长度,这样两个字符串都在Z中作为子序列出现。现在,我得到了长度= | X |的直觉。 + | Y | - | LCS(X,Y)|。但我们如何证明呢?

Ex:X = AGGTAB,Y = GXTXAYB,然后Z = AGXGTXAYB和| Z | = 9。 LCS(X,Y)= GTAB

参考:Link 1 Link 2

3 个答案:

答案 0 :(得分:2)

首先,查看您发送的第二个链接,可以创建一个大小为| X |的超级序列+ | Y | - | LCS(X,Y)|:

  

对于两个输入序列,scs可以很容易地从最长的公共子序列(lcs)形成...

所以现在剩下的就是证明它实际上是最短的常见超级序列。假设相反,假设存在最短的公共超序列,使得其长度为| X | + | Y | - | LCS(X,Y)| - 1 == | X | + | Y | - (| LCS(X,Y)| + 1)。但是在这个字符串中,你有X作为子序列,Y作为子序列。这意味着它们在| LCS(X,Y)|中相交+ 1个地方根据字符串的大小来判断。即,存在大小为| LCS(X,Y)|的LCS + 1,与LCS的定义相矛盾!

因此,大小正好是| X | + | Y | - | LCS(X,Y)|。 q.e.d

答案 1 :(得分:1)

由于您只关心字母的数量,因此您可以对所有序列(X,Y,Z和LCS(X,Y))进行排序。这是因为排序序列(在确定最小的一个和LCS之后)将保持字母的计数相同。

如果您正在考虑排序序列,您只需要考虑由1个字母组成的序列。这是因为每个序列中每个字母的计数与每个序列中所有其他字母的计数无关。

现在,如果你考虑只包含一个字母的序列,那么很明显,包含X和Y作为子序列的最小序列将是X或Y,而LCS(X,Y)将是另一个一。所以(使用最小包含序列的符号“MCS”),| MCS(X,Y)| + | LCS(X,Y)| = | X | + | Y |。

答案 2 :(得分:0)

为字符串1,为字符串2.

设S是任何由X和Y组成的最短超序列。让我们尝试创建这样一个序列。

显然,X作为S中的序列存在。因此,最初S可以显示为:


注意:' ...'意味着地方可以是空的,或者可以用来将Y的字符放入其中,使其成为由X和Y组成的最短超级序列。

现在,这| S |必须是最低限度的。我们需要只将最小字符从Y注入到此S中,以使其成为由X和Y组成的最短超级序列。另外,请注意条件是Y需要显示为子序列而不是子字符串。因此,如果我发现Y中也出现Y的任何字符序列,则不需要注入Y的那些字符。

因此,对于| S |为了最小化,我们表明需要注入Y的最小字符,以便Y作为序列出现。为此,我们发现X的最长序列也出现在Y中,换句话说就是= LCS(X,Y)。

| S | = | X | +(| Y | - | LCS(X,Y)|)= | X | + | Y | - | LCS(X,Y)|

现在,存在多个LCS(X,Y)。拿任何并构建序列。