📅  最后修改于: 2023-12-03 14:50:48.539000             🧑  作者: Mango
给定两个字符串X
和Y
,编写一个程序来找到它们的最长公共子序列,并输出其长度。
子序列是由给定字符串在保持其相对顺序的情况下删除一些字符后形成的新字符串。
X = "AGGTAB"
Y = "GXTXAYB"
The Length of Longest Common Subsequence is 4
这道题可以用动态规划来解决。
定义L(i, j)
为X[0...i-1]
和Y[0...j-1]
的最长公共子序列的长度。那么问题的答案就是L(m, n)
,其中m = len(X)
,n = len(Y)
。
根据定义,我们可以得到以下的递推式:
L(i, j) = max(L(i-1, j), L(i, j-1)), 如果 X(i-1) != Y(j-1)
L(i, j) = L(i-1, j-1) + 1, 如果 X(i-1) == Y(j-1)
这里从1开始计数,所以访问字符串时下标要减1。
def lcs(X, Y):
m, n = len(X), len(Y)
L = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if 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])
return L[m][n]
X = "AGGTAB"
Y = "GXTXAYB"
print("The Length of Longest Common Subsequence is", lcs(X, Y))
时间复杂度为$O(mn)$,空间复杂度为$O(mn)$。
本题可以用动态规划来解决,时间复杂度为$O(mn)$,空间复杂度为$O(mn)$。