DP、哈希表、二分查找-718. 最長重複子數組

1、題目描述

https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/

給兩個整數數組 A 和 B ,返回兩個數組中公共的、長度最長的子數組的長度。

輸入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
輸出: 3 解釋: 長度最長的公共子數組是 [3, 2, 1]。

2、代碼詳解

  1. dp初始化問題:dp實際是存儲最大公共子串的默認值的數組,初始化爲0,因爲假設都是不存在重複子串嘛!
  2. 越界問題:但是要設置多少個0呢?我們考慮到i+1,所以必須設置爲len(A)+1,這裏有兩個數組,故dp=[[0]*(len(B)+1) for _ in range(len(A)+1)],其實這可看作是矩陣的常用寫法。
  3. 狀態:dp爲A和B的最長公共前綴,轉移方程:dp[i+1][j+1]=dp[i][j]+1。在此之後(斷開後)有可能會有更長的重複子串,故以result更新dp最大值,若是斷開之後將會重新從0開始算,這就是初始化爲啥要設爲0了!!
  4. 模板:動態方程一般都採用dp[i+1][j+1]=dp[i][j]+1,dp[i+1][j+1]=max(dp[i][j-1],dp[i-1][j])等類似的形式,然後一般會用res=max(dp[i+1][j+1],res),存儲最終結果。
class Solution(object):
    def findLength(self, A, B):
        """
        :type A: List[int]
        :type B: List[int]
        :rtype: int
        """
        m = len(A)
        n = len(B)
        dp = [[0]*(n+1) for _ in range(m+1)]
        res = 0
        for i in range(m):
            for j in range(n):
                if A[i] == B[j]:
                    dp[i+1][j+1] = dp[i][j] + 1
                    res = max(res, dp[i+1][j+1])
        # print(dp)
        return res

A = [1,2,3,2,1]
B = [3,2,1,4,7]
s = Solution()
print(s.findLength(A, B))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章