📌  相关文章
📜  国际空间研究组织 | ISRO CS 2020 |问题 23(1)

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

国际空间研究组织 | ISRO CS 2020 |问题 23

问题描述

给定两个字符串XY,编写一个程序来找到它们的最长公共子序列,并输出其长度。

子序列是由给定字符串在保持其相对顺序的情况下删除一些字符后形成的新字符串。

样例输入
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)$。