📅  最后修改于: 2023-12-03 15:25:46.177000             🧑  作者: Mango
最长公共子序列(LCS)是一种常见的字符串匹配问题,它是指在两个字符串序列中,找到一个最长的子序列,使得这个子序列在两个字符串中都出现过。
对于一个给定的字符串序列,有时候需要输出所有的最长公共子序列,而不仅仅是一个。这时候就需要使用“打印最长公共子序列”算法。
使用动态规划算法可以求出最长公共子序列的长度,但是要输出所有的最长公共子序列,则需要采用一些额外的步骤。
具体实现步骤如下:
代码实现如下:
def print_lcs(X, Y, m, n):
L = [[0 for x in range(n+1)] for y 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+1)
lcs[index] = ""
i,j = m,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
print("All LCS of ", X, "and", Y, ":")
print(", ".join(lcs))
X = "AGCAT"
Y = "GAC"
m = len(X)
n = len(Y)
print_lcs(X, Y, m, n)
以上代码将输出:
All LCS of AGCAT and GAC :
GA
AC
“打印最长公共子序列”算法可以方便地输出所有的最长公共子序列,而不仅仅是一个。其核心是在动态规划算法的基础上进行倒序遍历,并使用栈来保存最长公共子序列的字符。这个算法在实际工程中也有很多应用,特别是在字符串匹配领域有着广泛的应用。