📅  最后修改于: 2023-12-03 15:06:14.505000             🧑  作者: Mango
在计算机科学中,最长公共子序列(Longest Common Subsequence,简写为LCS)是指在所有给定序列中同时出现且顺序一致的最长子序列。这是计算机科学领域中比较常见的问题。给定两个数组,其中一个数组仅由不同的元素组成,我们需要找出两个数组的最长公共子序列。
为了求出两个数组的最长公共子序列,我们将使用动态规划算法。我们将创建一个二维数组,其大小为两个数组的长度。然后,我们将使用递归算法来填充此数组,以便计算最长公共子序列。
我们将使用以下步骤来填充二维数组:
def lcs(X, Y):
m = len(X)
n = len(Y)
L = [[0] * (n + 1) for i in range(m + 1)]
for i in range(m + 1):
for j in range(n + 1):
if i == 0 or j == 0:
L[i][j] = 0
elif X[i - 1] == Y[j - 1]:
L[i][j] = L[i - 1][j - 1] + 1
else:
L[i][j] = max(L[i - 1][j], L[i][j - 1])
index = L[m][n]
lcs = [""] * index
i = m
j = n
while i > 0 and j > 0:
if X[i - 1] == Y[j - 1]:
lcs[index - 1] = X[i - 1]
i -= 1
j -= 1
index -= 1
elif L[i - 1][j] > L[i][j - 1]:
i -= 1
else:
j -= 1
return "".join(lcs)
以上代码中的 lcs
函数接受两个字符串作为参数,返回它们的最长公共子序列。这个函数使用了一个二维数组 L
来存储中间结果。在 L
中,L[i][j]
表示 X 的前 i 个字符和 Y 的前 j 个字符的最长公共子序列的长度。
该函数使用两重循环来填充 L
。当 i = 0 或 j = 0 时,L[i][j] 值为 0,因为一个空序列和任何序列的最长公共子序列都是 0。
当 X[i - 1] == Y[j - 1] 时,我们可以将最后一个元素添加到最长公共子序列中。然后,我们递归地找到两个数组除去最后一个元素的子序列,并将两个子序列中的最长公共子序列添加到最后一个元素。
如果 X[i - 1] != Y[j - 1],则需要递归地查找两个数组除去最后一个元素的子序列并将两个子序列中的最长公共子序列添加到最后一个元素。最后,比较两个子序列中的最长公共子序列并返回最长的。
最后,我们使用 index
变量来跟踪最长公共子序列的长度,并初始化 lcs
列表来存储子序列。我们从 L[m][n]
开始,向上、向左或者向左上方查找该元素是如何得到的,一旦发现 matched,则将该字符添加到 lcs
列表中。如果找不到 matched,则向左或向上移动到下一个元素,直到 i = 0 或者 j = 0。最后,我们将 lcs
列表合并成字符串并返回。