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、代碼詳解
- dp初始化問題:dp實際是存儲最大公共子串的默認值的數組,初始化爲0,因爲假設都是不存在重複子串嘛!
- 越界問題:但是要設置多少個0呢?我們考慮到i+1,所以必須設置爲len(A)+1,這裏有兩個數組,故dp=[[0]*(len(B)+1) for _ in range(len(A)+1)],其實這可看作是矩陣的常用寫法。
- 狀態:dp爲A和B的最長公共前綴,轉移方程:dp[i+1][j+1]=dp[i][j]+1。在此之後(斷開後)有可能會有更長的重複子串,故以result更新dp最大值,若是斷開之後將會重新從0開始算,這就是初始化爲啥要設爲0了!!
- 模板:動態方程一般都採用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))