718. 最长重复子数组
确定dp数组(dp table)以及下标的含义
dp[i] [j]:以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i] [j]。 (特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 )
这样做的目的是为了方便初始化
确定递推公式
根据dp[i] [j]的定义,dp[i][j]的状态只能由dp[i - 1] [j - 1]推导出来。
即当A[i - 1] 和B[j - 1]相等的时候,dp[i] [j] = dp[i - 1] [j - 1] + 1;
dp数组如何初始化
需要初始化为0,举个例子A[0]如果和B[0]相同的话,dp[1] [1] = dp[0] [0] + 1,只有dp[0] [0]初始为0,正好符合递推公式逐步累加起来。
确定遍历顺序
外层for循环遍历A,内层for循环遍历B。或者反过来也可以,从左到右遍历是因为dp[i] [j] 由dp[i-1] [j-1]推导
举例推到dp数组
js
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findLength = function (nums1, nums2) {
let dp = Array.from({ length: nums1.length + 1 }, () => Array(nums2.length + 1).fill(0))
let result = 0
for (let i = 1; i <= nums1.length; i++) {
for (let j = 1; j <= nums2.length; j++) {
if (nums1[i - 1] === nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1
result = Math.max(result, dp[i][j])
}
}
}
return result
};