0718最长重复子数组 Marathon

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

示例:

输入:
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

参考:

python

# 0718.最长重复子数组

class Solution:
    def maxLengthOfSubarr(self, nums1: [int], nums2: [int]) -> int:
        """
        动态规划,最大重复子数组-二维数组
        1.dp定义及下标
        - dp[i][j], 下标i-1结尾的nums1数组,与下标j-1结尾的nums2数组的,最长重复子数组长度
        2.递推公式
        - dp[i][j] = dp[i-1][j-1] + 1
        3.初始化
        - dp[0][i] = dp[i][0] = 0
        4.遍历顺序
        - 先1后2,或者先2后1
        :param nums1:
        :param nums2:
        :return:
        """
        dp = [[0]*(len(nums2)+1) for _ in range(len(nums1)+1)]
        res = 0
        for i in range(1, len(nums1)+1):
            for j in range(1, len(nums2)+1):
                if nums1[i-1] == nums2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                res = max(res, dp[i][j])
        return res

    def maxLengthOfSubarr_(self, nums1: [int], nums2: [int]) -> int:
        """
        动态规划,最大重复子数组-滚动数组

        :param nums1:
        :param nums2:
        :return:
        """
        dp = [0] * (len(nums2)+1)
        res = 0
        for i in range(1, len(nums1)+1):
            for j in range(len(nums2), 0, -1): # 避免重复覆盖
                if nums1[i-1] == nums2[j-1]:
                    dp[j] = dp[j-1] + 1
                else:
                    dp[j] = 0 # update
                res = max(res, dp[j])
        return res

golang

package dynamicPrograming


// 动态规划-二维数组
func maxLengthOfSubarr(nums1, nums2 []int) int {
	dp := make([][]int, len(nums1)+1)
	for i:=0;i<=len(nums1);i++ {
		dp[i] = make([]int, len(nums2)+1)
	}
	res := 0
	for i:=1;i<=len(nums1);i++ {
		for j:=1;j<=len(nums2);j++ {
			if nums1[i-1] == nums2[j-1] {
				dp[i][j] = dp[i-1][j-1] + 1
			}
			res = max(res, dp[i][j])
		}
	}
	return res
}

// 动态规划-一维数组/滚动数组
func maxLengthOfSubarr_(nums1, nums2 []int) int {
	dp := make([]int, len(nums2)+1)
	res := 0
	for i:=0;i<=len(nums2);i++ {
		dp[i] = 0
	}
	for i:=1;i<=len(nums1);i++ {
		for j:=len(nums2);j>=1;j-- {
			if nums1[i-1] == nums2[j-1] {
				dp[j] = dp[j-1] + 1
			} else {
				dp[j] = 0
			}
			res = max(res, dp[j])
		}
	}
	return res
}

func max(a,b int) int {
	if a > b {return a}
	return b
}
原文地址:https://www.cnblogs.com/davis12/p/15644741.html