在最长公共子序列(LCS)问题中,为什么我们匹配字符串的最后一个字符。对于前者
考虑输入字符串“AGGTAB”
和“AXTXAYB”
。最后一个字符匹配字符串。所以LCS的长度可以写成:
L(“AGGTAB”, “AXTXAYB”) = 1 + L(“AGGTA”, “AXTXAY”)
如果我们匹配字符串的第一个字符,算法是否仍然会产生最佳搜索。例如
考虑输入字符串“AGGTAB”
和“AXTXAYB”
。第一个字符匹配字符串。所以LCS的长度可以写成:
L(“AGGTAB”, “AXTXAYB”) = 1 + L(“GGTAB”, “XTXAYB”)
答案 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)
是的,你可以这样做,它不会改变时间的复杂性。从最后开始只是一个惯例问题。