Skip to content

最长重复子数组

js
// 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

// 示例:

// 输入:

// A: [1,2,3,2,1]
// B: [3,2,1,4,7]
// 输出:3
// 解释:长度最长的公共子数组是 [3, 2, 1] 。

function fn(a, b){
    // dp[i][j] 代表i-1结尾的a与j-1结尾的b最长重复子数组
    // 初始化为0
    const alen = a.length, blen = b.length, dp = new Array(alen + 1).fill(0).map(() => new Array(blen + 1).fill(0))
    let res = 0
    for(let i = 1; i <= alen; i ++){
        for(let j = 1; j <= blen; j ++){
            if(a[i - 1] === b[j - 1]){
                // 递推公式:dp[i][j] = dp[i - 1][j - 1] + 1
                dp[i][j] = dp[i - 1][j - 1] + 1
            }
            res = Math.max(dp[i][j], res)
        }
    }
    console.table(dp);
    return res
}

console.log(fn([1,2,3,2,1], [3,2,1,4,7]))

// ┌─────────┬───┬───┬───┬───┬───┬───┐
// │ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
// ├─────────┼───┼───┼───┼───┼───┼───┤
// │    0    │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
// │    1    │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │i:3,j=1; [1,2,3,2] | [3,2]  a[i-1] === b[j-1]; so => dp[3][1] = 1
// │    2    │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │i:2,j=2; [1,2,3] | [3,2,1]  a[i-1] === b[j-1]; so => dp[2][2] = 1
// │    3    │ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │i:1,j=3; [1,2] | [3,2,1,4]  a[i-1] === b[j-1]; so => dp[1][3] = 1
// │    4    │ 0 │ 0 │ 2 │ 0 │ 0 │ 0 │
// │    5    │ 0 │ 0 │ 0 │ 3 │ 0 │ 0 │
// └─────────┴───┴───┴───┴───┴───┴───┘
// 给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

// 示例:

// 输入:

// A: [1,2,3,2,1]
// B: [3,2,1,4,7]
// 输出:3
// 解释:长度最长的公共子数组是 [3, 2, 1] 。

function fn(a, b){
    // dp[i][j] 代表i-1结尾的a与j-1结尾的b最长重复子数组
    // 初始化为0
    const alen = a.length, blen = b.length, dp = new Array(alen + 1).fill(0).map(() => new Array(blen + 1).fill(0))
    let res = 0
    for(let i = 1; i <= alen; i ++){
        for(let j = 1; j <= blen; j ++){
            if(a[i - 1] === b[j - 1]){
                // 递推公式:dp[i][j] = dp[i - 1][j - 1] + 1
                dp[i][j] = dp[i - 1][j - 1] + 1
            }
            res = Math.max(dp[i][j], res)
        }
    }
    console.table(dp);
    return res
}

console.log(fn([1,2,3,2,1], [3,2,1,4,7]))

// ┌─────────┬───┬───┬───┬───┬───┬───┐
// │ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
// ├─────────┼───┼───┼───┼───┼───┼───┤
// │    0    │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
// │    1    │ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │i:3,j=1; [1,2,3,2] | [3,2]  a[i-1] === b[j-1]; so => dp[3][1] = 1
// │    2    │ 0 │ 0 │ 1 │ 0 │ 0 │ 0 │i:2,j=2; [1,2,3] | [3,2,1]  a[i-1] === b[j-1]; so => dp[2][2] = 1
// │    3    │ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │i:1,j=3; [1,2] | [3,2,1,4]  a[i-1] === b[j-1]; so => dp[1][3] = 1
// │    4    │ 0 │ 0 │ 2 │ 0 │ 0 │ 0 │
// │    5    │ 0 │ 0 │ 0 │ 3 │ 0 │ 0 │
// └─────────┴───┴───┴───┴───┴───┴───┘