求所有最大公共子序列的算法实现
最大公共子序列(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)函数,可以得到给定两个序列的最大公共子序列的长度和具体的子序列。