leetcode 718 最长重复子数组 动态规划

    技术2022-07-11  108

    题目描述

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

    示例 1:

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

    1 <= len(A), len(B) <= 1000 0 <= A[i], B[i] < 100

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    题目其实相当于字符串中的最长公共字串长度,使用二维数组记录每个位置对应的上一位是否匹配。如图所示 状态转移方程如下

    if(a[i] == b[i]) dp[i][j] = dp[i-1][j-1]+1 else dp[i][j] = 0

    代码

    kotlin代码,为了防止i-1越界初始化二维数组长度+1

    fun findLength(A: IntArray, B: IntArray): Int { var len = A.size var max = 0 // 初始化二维数组 var dp = Array(len + 1, { Array(len + 1) { it -> 0 } }) // 状态转移方程 if(A[j-1] == B[j-1]) dp[i][j] = dp[i-1][j-1]+1 else dp[i][j] = 0 for (i in 1..len) { for (j in 1..len) { if (A[i - 1] == B[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1 else dp[i][j] = 0 max = Math.max(dp[i][j], max) } } return max }
    Processed: 0.021, SQL: 9