leetcode每日一题(2020-07-01):718. 最长重复子数组

题目描述:
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

今日学习:
1.动态规划真的是变化无穷
2.滑动窗口也是
题解:
1.动规:若A\B中数字相等,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;
}
posted @ 2020-07-01 11:14  秋夜星空  阅读(106)  评论(0编辑  收藏  举报