📅  最后修改于: 2023-12-03 15:23:03.262000             🧑  作者: Mango
给定两个字符串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)$。