📌  相关文章
📜  教资会网络 | UGC NET CS 2016 年 8 月 – III |问题 45(1)

📅  最后修改于: 2023-12-03 14:54:50.389000             🧑  作者: Mango

UGC NET CS 2016 年 8 月 – III |问题 45

这是一道关于计算机科学的问题,适合程序员学习和掌握。

问题

在给定2个字符串A和B的情况下,最长公共子序列(LCS)问题是要找出两者共同具有的最长子序列的长度。

考虑以下递归方式计算LCS(A,B):

     |  0   如果i = 0或j = 0,否则
L(i,j)=|  L(i-1,j-1)+1 如果A[i-1]=B[j-1]
     |  max(L(i,j-1),L(i-1,j)) 如果A[i-1]!=B[j-1]

考虑将该问题转化为动态编程问题并给出其解决方案。使用该解决方案查找字符串s1 = “AGGTAB”和s2 = “GXTXAYB”的LCS。

解决方案

该问题可以被转化为一个动态编程问题。可以创建一个表来存储已知的LCS值,以便在需要时进行查找。

为了解决LCS(A,B),可以创建一个表L [0 ... m] [0 ... n],其中m和n分别是A和B的长度。

L [i] [j]中的值表示A [0 ... i-1]和B [0 ... j-1]的LCS的长度。表中的所有其他项都可以通过递归方程式计算。

以下是使用动态编程的Python代码:

def lcs(X, Y, m, n):
    L = [[None]*(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])
    return L[m][n]
 
X = "AGGTAB"
Y = "GXTXAYB"
print("Length of LCS is ", lcs(X , Y, len(X), len(Y)))

该程序将输出以下内容:

Length of LCS is  4

这表明AGGTAB和GXTXAYB之间的最长公共子序列具有4个字符。