718. Maximum Length of Repeated Subarray

本文介绍了一种利用动态规划算法解决寻找两个整数数组中最大长度重复子数组的问题,通过构建状态转移方程,有效地找出最长子串,示例代码清晰地展示了算法实现过程。

718Maximum Length of Repeated Subarray

题目描述

Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays.

Example 1:

Input:
A: [1,2,3,2,1]    B: [3,2,1,4,7]
Output: 3
Explanation: The repeated subarray with maximum length is [3, 2, 1].

Note:

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

分析

使用动态规划算法,首先需要找出做动态规划的状态,与状态转移方程。 
设 C[i][j] 为以 A[i] 和 B[j] 结尾的最长子串的长度,可以看出这种状态表示方法可以表示找出最长子串。 
状态转移方程:

C[i][j]=A[i]==B[j]?C[i−1][j−1]+1:0

当A[i] 和 B[j] 相等时,A[i - 1:]  B[j - 1:] 的子串可以增长1,若不相等,则此处最长子串长度为0 。 

 

得出解答:

 

class Solution(object):
    def findLength(self, A, B):
        dp=[[0]*(len(A)+1) for _ in xrange(len(B)+1)]
        ans=0
        # 从数组的末尾开始,从后向前遍历数组
        for i in xrange(len(A)-1,-1,-1):
            for j in xrange(len(B)-1,-1,-1):
                if A[i]==B[j]:
                    dp[i][j]=1+dp[i+1][j+1]
                ans=max(ans,dp[i][j])
        return ans

最后两行可以合并

return max(max(row) for row in dp)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值