📜  最长公共字谜子序列(1)

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

最长公共子序列

最长公共子序列(Longest Common Subsequence,缩写为 LCS)是指在两个或多个序列中,以相同顺序出现,但不要求连续的子序列,且要求子序列在各序列中的位置顺序相同的情况下,所包含元素最多。

动态规划

求解最长公共子序列问题最常用的算法是动态规划。

假设给定两个字符串 S1 和 S2,分别求出它们的最长公共子序列。首先,定义一个二维的 DP 数组 dp。其中,dp[i][j] 表示 S1[0…i] 和 S2[0…j] 的最长公共子序列长度。

  • 如果 S1[i] == S2[j],那么 dp[i][j] = dp[i-1][j-1] + 1;
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。

最长公共子序列的长度即为 dp[len(S1)-1][len(S2)-1]。

代码实现
def lcs(s1: str, s2: str) -> int:
    len1, len2 = len(s1), len(s2)
    dp = [[0] * (len2 + 1) for _ in range(len1 + 1)]

    for i in range(1, len1 + 1):
        for j in range(1, len2 + 1):
            if s1[i - 1] == s2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])

    return dp[-1][-1]
示例
s1 = "ABCD"
s2 = "ACDF"
print(lcs(s1, s2))  # 3

上面的示例中,S1 和 S2 的最长公共子序列为 ACD。