Leetcode 系列 —— 《718. 最长重复子数组》

225 阅读1分钟

题目链接

leetcode-cn.com/problems/ma…

参考

www.bilibili.com/video/BV1eC…

解题思路

dp 矩阵:

// 假如 nums1[i] === nums2[k], 那么 dp[i][k] 即是它的左上角的值 + 1

         1 0 0 0 1
       1 1 0 0 0 1
       0 0 2 1 1 0
       0 0 1 3 2 0
       1 1 0 0 0 1
       1 1 0 0 0 1

解题代码


var findLength = function(nums1, nums2) {
      // 切记生成二位矩阵的时候,不要用 const dp = Array(nums1.length).fill(() => Array(nums2.length).fill(0)), 因为是生成的 num2 的数组是同一个引用。
      const dp = Array.from(Array(nums1.length), () => Array(nums2.length).fill(0));

      let ret = 0;
      for (let i = 0; i < nums1.length; i++) {
        for (let k = 0; k < nums2.length; k++) {
        // 假如相等那么就去处理即可
          if (nums1[i] === nums2[k]) {
          	if (dp[i - 1] && dp[i - 1][k - 1]) {
                        dp[i][k] = dp[i - 1][k - 1] + 1;
                } else {
                    dp[i][k] = 1;
                }
                ret = Math.max(dp[i][k], ret)
          }
        }
      }
    return ret;
};