🧩Algo 多维动归

1143. 最长公共子序列

难度:🟡 Medium | 标签:动归 | 状态:⬜ LeetCode 链接

思路

dp[i][j] = text1[0..i)text2[0..j) 的 LCS 长度。

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

代码

class Solution {
public:
    int longestCommonSubsequence(string a, string b) {
        int m = a.size(), n = b.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        for (int i = 1; i <= m; ++i)
            for (int j = 1; j <= n; ++j) {
                if (a[i - 1] == b[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)(可滚动到 O(n))

易错 / 回顾

  • 「子序列」≠「子串」(不连续 vs 连续)
  • 索引下移 1 对齐 dp 表,base 行列全 0
  • 最长公共子:不相等时 dp 重置为 0,不取邻最大
Related · 多维动归