📜  最长公共子序列的Python程序(1)

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

最长公共子序列的Python程序

最长公共子序列(LCS)是指在两个序列中都出现的最长子序列,而不要求子序列在原序列中的位置是连续的。LCS问题被广泛应用于文本比较、语音识别、基因序列分析等领域。

下面是一个简单的Python实现,使用动态规划算法解决最长公共子序列问题。

算法思路

dp[i][j]表示text1[:i]text2[:j]的最长公共子序列的长度。则有:

  • text1[i-1] == text2[j-1],则dp[i][j] = dp[i-1][j-1] + 1
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])

其中,text1[:i]表示text1中第0个字符到第i个字符组成的子串,text2[:j]同理。

代码实现
def longest_common_subsequence(text1: str, text2: str) -> int:
    m, n = len(text1), len(text2)
    # 初始化 dp
    dp = [[0] * (n+1) for _ in range(m+1)]
    # 计算最长公共子序列长度
    for i in range(1, m+1):
        for j in range(1, n+1):
            if text1[i-1] == text2[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]
测试样例

我们来测试一下上面的代码是否正确:

text1 = "abcde"
text2 = "ace"
print(longest_common_subsequence(text1, text2))  # 3

结果应该是3,对吧!

时间复杂度

算法的时间复杂度是O(mn),其中m和n分别是text1和text2的长度。因此,当序列很长时,算法可能会比较慢。不过,由于算法使用了动态规划的思想,一般情况下都能够在合理的时间内得出答案。

参考资料