📜  打印最长公共子序列 |套装 2(全部打印)(1)

📅  最后修改于: 2023-12-03 15:25:46.177000             🧑  作者: Mango

打印最长公共子序列 |套装 2(全部打印)

简介

最长公共子序列(LCS)是一种常见的字符串匹配问题,它是指在两个字符串序列中,找到一个最长的子序列,使得这个子序列在两个字符串中都出现过。

对于一个给定的字符串序列,有时候需要输出所有的最长公共子序列,而不仅仅是一个。这时候就需要使用“打印最长公共子序列”算法。

算法实现

使用动态规划算法可以求出最长公共子序列的长度,但是要输出所有的最长公共子序列,则需要采用一些额外的步骤。

具体实现步骤如下:

  1. 使用动态规划算法求出最长公共子序列的长度。
  2. 倒序遍历动态规划表格,对于每一个能够产生最优解的格子,都将其对应的字符加入一个栈中。
  3. 从栈中依次弹出字符,即为一个最长公共子序列的序列值。

代码实现如下:

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
总结

“打印最长公共子序列”算法可以方便地输出所有的最长公共子序列,而不仅仅是一个。其核心是在动态规划算法的基础上进行倒序遍历,并使用栈来保存最长公共子序列的字符。这个算法在实际工程中也有很多应用,特别是在字符串匹配领域有着广泛的应用。