最长公共子序列—动态规划算法(Longest Common Subsequence)
让我们来讨论如何使用动态规划算法来解决LCS问题。
LCS问题陈述:给定两个序列,找出两个序列中存在的最长子序列的长度。
子序列是以相同的相对顺序出现的序列,但不一定是连续的。例如,“abc”、“abg”、“bdf”、“aeg”、“'”acefg“等等都是“abcdefg”的子序列。所以一个长度为n的字符串有2^n个不同的可能子序列。
它是一个经典的计算机科学问题,是diff(一个输出两个文件之间差异的文件比较程序)的基础,在生物信息学中有着广泛的应用。
举例:
对于给定的字符串 “ABCDGH” 和 “AEDFHR”,其最长公共子序列为: “ADH”,最长公共子序列的长度为:3。
对于给定的字符串 “AGGTAB” 和 “GXTXAYB”,其最长公共子序列为:“GTAB”,最长公共子序列的长度为:4。
算法分析
这个问题的简单解决方案是生成两个给定序列的所有子序列,并找到最长的匹配子序列。根据时间复杂性,这个解是指数的。让我们看看这个问题如何具有动态规划(DP)问题的两个重要特性。
最优子结构
输入序列分别为长度m和n的X[0..m-1]和Y[0..n-1]。
设L(x[0..m-1],y[0..n-1])为两个序列X和Y的LCS的长度,下面是L&