Leetcode刷题Python718. 最长重复子数组

Posted Better Bench

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题Python718. 最长重复子数组相关的知识,希望对你有一定的参考价值。

1 题目

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

示例 1:

输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
输出:3
解释:长度最长的公共子数组是 [3,2,1] 。

示例 2:

输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
输出:5

2 解析

(1)暴力求解
时间复杂度O(n^3)

(2)动态规划
状态:重复子数组的长度
状态转移:从后往前遍历,如果元素相同,则dp等于前一个相同元素的dp加1。
d p [ i ] [ j ] = d p [ i + 1 ] [ j + 1 ] + 1 dp[i][j] = dp[i+1][j+1]+1 dp[i][j]=dp[i+1][j+1]+1

3 Python

(1)方法一:有的例子会超时

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:

        ans = 0
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                k = 0
                while (i+k)<len(nums1) and (j+k)<len(nums2) and nums1[i+k] == nums2[j+k] :
                    k += 1
                ans = max(ans, k)
        return ans

(2)方法二

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:

        n = len(nums1)
        m = len(nums2)
        dp = [[0]*(m+1) for _ in range(n+1)] 
        ans = 0
        # 注意边界,从n-1和m-1开始,否则i+1就超出范围了
        for i in range(n-1,-1,-1):
            for j in range(m-1,-1,-1):
                dp[i][j] = dp[i+1][j+1]+1 if nums1[i]==nums2[j] else 0
                ans = max(ans,dp[i][j])
        return ans
             

以上是关于Leetcode刷题Python718. 最长重复子数组的主要内容,如果未能解决你的问题,请参考以下文章

动态规划:最长重复子数组

动态规划:最长重复子数组

leetcode力扣刷题系列python——3无重复字符的最长子串

精选力扣500题 第51题 LeetCode 718. 最长重复子数组c++/java详细题解

Leetcode刷题Python子数组查找

leetcode刷题3.无重复字符的最长子串