最长的共同后续Algo

时间:2014-05-15 19:09:58

标签: algorithm dynamic-programming

在最长公共子序列(LCS)问题中,为什么我们匹配字符串的最后一个字符。对于前者 考虑输入字符串“AGGTAB”“AXTXAYB”。最后一个字符匹配字符串。所以LCS的长度可以写成:

L(“AGGTAB”, “AXTXAYB”) = 1 + L(“AGGTA”, “AXTXAY”)

如果我们匹配字符串的第一个字符,算法是否仍然会产生最佳搜索。例如

考虑输入字符串“AGGTAB”“AXTXAYB”。第一个字符匹配字符串。所以LCS的长度可以写成:

L(“AGGTAB”, “AXTXAYB”) = 1 + L(“GGTAB”, “XTXAYB”)

LCS问题:Longest Common Subsequence Problem

3 个答案:

答案 0 :(得分:2)

是的,这是一回事。

计算两个反向序列的LCS与在反转之前反转两个序列的LCS相同。换句话说,

REVERSE(LCS(A,B)) = LCS(REVERSE(A), REVERSE(B))

假设LCS从末尾开始减少,右边的操作将从另一端开始,但是会得到相同的结果。

这就是为什么你可以像处理说明中的后缀一样处理前缀的原因:你会在这个过程中得到同样的递归减少。

此外,如果您愿意,可以减少两端。但是,这会使算法复杂化,而不会给你任何加速回报。

答案 1 :(得分:1)

事实证明,如果我们从上次执行LCS,您可以直接在用户提供的递归中使用 长度变量(比如说M,N) 。另一方面,如果从start index开始,则必须创建额外的变量。这就是前一种方法被认为是标准的原因,否则没有复杂性差异,一切都是一样的。

LCS (M, N)
{
if(M==0 || N==0)
return 0;
elseif (a[M]!=b[N])
return max(LCS(M,N-1), LCS(M-1,N));
else
return 1 + LCS(M-1,N-1);
}

答案 2 :(得分:0)

是的,你可以这样做,它不会改变时间的复杂性。从最后开始只是一个惯例问题。