LC 1143动态规划中等第 83 / 95 题

最长公共子序列

Longest Common Subsequence

动态规划二维 DP
本机进度仅保存在当前浏览器

题目描述

给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度;不存在则返回 0。子序列是从原字符串中删除部分(或不删除)字符而不改变相对顺序形成的新字符串。

示例:text1 = "abcde",text2 = "ace",最长公共子序列为 "ace",输出 3。

解题思路

  1. 二维状态 dp[i][j]:text1 前 i 个字符与 text2 前 j 个字符的 LCS 长度。
  2. 末字符相等:dp[i][j] = dp[i-1][j-1] + 1;不等:两侧分别退一位取较大值。
  3. 滚动数组可把空间压到 O(min(m, n)),注意用临时变量保存左上角状态。

参考实现

查看参考实现Python · 建议先自行作答
def longestCommonSubsequence(t1, t2):
    m, n = len(t1), len(t2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if t1[i - 1] == t2[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(m · n)
空间复杂度O(m · n)
所属分类动态规划
题源LeetCode 1143

关联教程

返回题图鉴