Cover image for leetcode热题100 P1143 最长公共子序列

leetcode热题100 P1143 最长公共子序列

字数 351
阅读
访客

时间轴

时间轴

2026-03-21

init

动态规划

题目:

经典问题了,dp[i][j]表示text1[0..=i]text2[0..=j]的最长公共子序列长度,状态转移方程为

  • text1[i]==text2[j] text1[i] == text2[j] 时:
    • dp[i][j]=dp[i1][j1]+1 dp[i][j] = dp[i-1][j-1] + 1
  • otherwise:
    • dp[i][j]=max(dp[i1][j],dp[i][j1]) dp[i][j] = max(dp[i-1][j], dp[i][j-1])
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
#include <string>#include <vector>using std::string;using std::vector;class Solution {    public:        int longestCommonSubsequence(string text1, string text2)        {                int i, j, n1 = text1.size(), n2 = text2.size();                vector<vector<int> > dp(n1, vector<int>(n2, 0));                for (i = 0; i < n1; i++) {                        if (text1[i] == text2[0]) {                                while (i < n1)                                        dp[i++][0] = 1;                                break;                        }                }                for (j = 0; j < n2; j++) {                        if (text2[j] == text1[0]) {                                while (j < n2)                                        dp[0][j++] = 1;                                break;                        }                }                // dp[i][j] 表示 text1[0..=i] 和 text2[0..=j] 的最长公共子序列长度                // dp[i][j] = dp[i-1][j-1] + 1 (text1[i] == text2[j])                // dp[i][j] = max(dp[i-1][j], dp[i][j-1])                for (i = 1; i < n1; i++) {                        for (j = 1; j < n2; j++) {                                if (text1[i] == text2[j])                                        dp[i][j] = dp[i - 1][j - 1] + 1;                                else                                        dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]);                        }                }                return dp[n1 - 1][n2 - 1];        }};
评论加载中…