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

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

国际空间研究组织 | ISRO CS 2013 |问题 67

问题描述

给定两个字符串s1和s2,找到它们中最长的共同子序列,并返回其长度。

例如
输入: s1 = "ABCDGH", s2 = "AEDFHR"
输出: 3
解释: 最长公共子序列为 "ADH",长度为 3。
输入: s1 = "AGGTAB", s2 = "GXTXAYB"
输出: 4
解释: 最长公共子序列为 "GTAB",长度为 4。
思路

使用动态规划来解决此问题。

我们可以定义 $dp[i][j]$ 为字符串 $s1$ 中前 $i$ 个字符和字符串 $s2$ 中前 $j$ 个字符的最长公共子序列的长度。

当 $s1[i-1] == s2[j-1]$ 时,说明当前字符能够匹配,所以可以得到状态转移方程:

$dp[i][j] = dp[i-1][j-1] + 1$

当 $s1[i-1] \neq s2[j-1]$ 时,说明当前字符不能匹配,所以可以得到状态转移方程:

$dp[i][j] = \max(dp[i-1][j], dp[i][j-1])$

最终的结果就是 $dp[m][n]$,其中 $m$ 和 $n$ 分别是字符串 $s1$ 和 $s2$ 的长度。

代码实现

以下是 Python 3 代码实现示例:

def longestCommonSubsequence(s1: str, s2: str) -> int:
    m, n = len(s1), len(s2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if s1[i-1] == s2[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    return dp[m][n]

此函数时间复杂度为 $O(mn)$,空间复杂度为 $O(mn)$。