Skip to content

力扣链接:1143.最长公共子序列

难度:⭐⭐

解题关键词:动态规划

解题思路:使用动态规划来做,dp[i][j]代表第一个字符串从 [0, i-1] 和第二个字符串从 [0, j-1] 最长的公共子串,如果 i-1 和 j-1 位置字母相同,那我们就取 dp[i-1][j-1]最长 + 1,如果不想等,我们 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) 就取各自分别去掉一个字母,然后最长子串的最大值。

typescript
function longestCommonSubsequence(text1: string, text2: string): number {
  const len1 = text1.length;
  const len2 = text2.length;

  // 要多创建一行一列,用来存放边界情况
  const dp = new Array(len1 + 1).fill(0).map(() => new Array(len2 + 1).fill(0));

  for (let i = 1; i <= len1; i++) {
    for (let j = 1; j <= len2; j++) {
      if (text1[i - 1] === text2[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }

  return dp[len1][len2];
}