115. Leetcode 718. 最长重复子数组 (动态规划-子序列问题)

步骤一、确定状态:

确定dp数组及下标含义

dp[i][j]表示的是长度为i的A数组和长度为j的B数组公共的长度最长的子数组的长 度。

步骤二、推断状态方程:

考虑下dp[i][j], 因为这里的子数组必须是连续的,所以只需要 考虑前面的一个状态即可,也就是由dp[i-1][j-1]推导出来的

如果当前的两个元素相同, 即A[i]==B[j], 则说明当前元素可 以构成公共子数组,那么当前俩数组组成的最长的公共连续子 数组长度就是dp[i-1][j-1]+1,也就是在之前的基础上加上最后 1位新的。

如果当前的两个元素不相同, 即A[i]!=B[j], 这说明当前的元 素无法构成公共子数组,因为公共子数组是连续的,而当前这 俩哥们不相等,那么此时d[i][j]=0,要从0开始重新算了。

步骤三、规定初始条件:

初始条件:

全局初始化的时候都初始化为0

步骤四、计算顺序: 外层遍历A数组,内层遍历B数组

class Solution:
    def findLength(self, nums1: List[int], nums2: List[int]) -> int:
        if not nums1 or not nums2:
            return 0

        dp = [[0 for _ in range(len(nums2) + 1)] for _ in range(len(nums1) + 1)]
        result = 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

                result = max(result, dp[i][j])

        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值