📜  门| GATE CS 2020 |第 42 题(1)

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

GATE CS 2020 Question 42

本题是一道针对程序员的算法题,涉及到最长公共子序列的问题。

题目描述

给定两个字符串S1和S2,求S1和S2的最长公共子序列的长度。

示例

输入:

S1 = "ABCBDAB"

S2 = "BDCABA"

输出:

4 (最长公共子序列为"BCBA")

解题思路

此题采用动态规划算法进行求解。设LCS(i, j)表示字符串S1的前i个字符和字符串S2的前j个字符的最长公共子序列的长度,则有以下递推公式:

  • 如果S1[i] == S2[j],则LCS(i, j) = LCS(i-1, j-1) + 1
  • 如果S1[i] != S2[j],则LCS(i, j) = max(LCS(i-1, j), LCS(i, j-1))

最终答案为LCS(m, n),其中m和n分别为S1和S2的长度。

代码实现

下面是Python实现代码片段:

def longest_common_subsequence(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),其中m和n分别为S1和S2的长度。