求所有最大公共子序列的算法实现
最大公共子序列(LCS)问题的定义
最大公共子序列(Longest Common Subsequence,简称LCS)是指在给定的两个序列中,找到最长的共同子序列的问题。子序列是指不要求连续,但要求相对顺序一致的一系列字符。
动态规划法解决最大公共子序列问题
动态规划法是解决最大公共子序列问题的常用方法。它通过将问题划分成多个子问题,逐步求解,最终得到整个问题的解。具体步骤如下:
- 定义一个二维数组matrix,其大小为(m+1)×(n+1),其中m和n分别为给定两个序列的长度。
- 初始化第一行和第一列的值为0。
- 从第二行和第二列开始,遍历matrix数组。
- 若两个序列对应的字符相等(sequence1[i-1] == sequence2[j-1]),则matrix[i][j] = matrix[i-1][j-1] + 1。
- 若两个序列对应的字符不相等,则matrix[i][j] = max(matrix[i-1][j], matrix[i][j-1]),即取左方格子和上方格子中的较大值。
- 最终,matrix[m][n]即为最大公共子序列的长度。
- 通过回溯matrix数组,可以得到最大公共子序列。从右下角(matrix[m][n])开始,根据其周围格子的值逐步回溯,若当前格子的值比左方格子和上方格子的值都大,则将该格子对应的字符添加到结果中,同时向左上方移动一格,直到回溯到第一行或第一列。
动态规划法解决最大公共子序列问题的实现
def lcs(sequence1, sequence2): m = len(sequence1) n = len(sequence2) matrix = [[0] * (n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if sequence1[i-1] == sequence2[j-1]: matrix[i][j] = matrix[i-1][j-1] + 1 else: matrix[i][j] = max(matrix[i-1][j], matrix[i][j-1]) lcs_length = matrix[m][n] lcs_sequence = [] i = m j = n while i > 0 and j > 0: if sequence1[i-1] == sequence2[j-1]: lcs_sequence.append(sequence1[i-1]) i -= 1 j -= 1 elif matrix[i-1][j] > matrix[i][j-1]: i -= 1 else: j -= 1 lcs_sequence.reverse() return lcs_length, lcs_sequence
通过调用lcs(sequence1, sequence2)函数,可以得到给定两个序列的最大公共子序列的长度和具体的子序列。