LCS问题陈述:
给定两个序列,求它们中最长子序列的长度。子序列是以相同的相对顺序出现的序列,但不一定是连续的。例如,“abc”,“abg”,“bdf”,“aeg”,“acefg”,…是“abcdefg”的子序列。一个长度为n的字符串有2^n-1个不同的子序列,这意味着蛮力方法的时间复杂度是O(n * 2n)注意,检查两个字符串的子序列是否相同需要O(n)时间。这种时间复杂度可以通过动态规划来提高。
例子:
输入序列“ABCDGH”和“AEDFHR”的LCS为长度为3的“ADH”。
输入序列“AGGTAB”和“GXTXAYB”的LCS是长度为4的“GTAB”。
该问题的朴素解是生成两个给定序列的所有子序列并找到最长匹配子序列。这个解的时间复杂度是指数的。让我们看看这个问题如何同时具有动态规划(DP)问题的两个重要性质。
1)最优子结构:
设输入序列为X[0..]m - 1]和Y [0 . .n-1],长度分别为m和n。让L (X [0 . .m-1], Y[0..n-1])为两个序列X和Y的LCS长度。m - 1), Y [0 . . n - 1])。
如果两个序列的最后一个字符匹配(或X[m-1] == Y[n-1]),则
L (X [0 . .m-1, Y[0..n-1]) = 1 + L(X[0..])m - 2), Y (0 . . n))
如果两个序列的最后一个字符不匹配(或者X[m-1] != Y[n-1]),则
L (X [0 . .m-1, Y[0..n-1]) = MAX (L(X[0..])