题目描述:
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
今日学习:
1.动态规划真的是变化无穷
2.滑动窗口也是
题解:
1.动规:若AB中数字相等,dp[i][j] = dp[i - 1][j - 1] + 1,否则为0
2.滑动窗口:类似暴力法,滑动A和B分别对齐比较
//动态规划
var findLength = function(A, B) {
let m = A.length
let n = B.length
let dp = new Array(m + 1)
for(let i = 0; i < m + 1; i++) {
dp[i] = new Array(n + 1).fill(0)
}
let res = 0
for(let i = 1; i <= m; i++) {
for(let j = 1; j <= n; j++) {
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
res = Math.max(dp[i][j], res);
}
}
return res
};
//滑动窗口
var findLength = function(A, B) {
let m = A.length, n = B.length, res = 0;
for(let diff = -(m - 1); diff <= n - 1; ++diff) { // 枚举对应关系
for(let i = Math.max(0, -diff), l = 0; i < Math.min(m, n - diff); ++i) { // 遍历公共部分
l = (A[i] == B[i + diff]) ? (l + 1) : 0;
res = Math.max(res, l);
}
}
return res;
}