給兩個整數陣列a
和b
,返回兩個陣列中公共的、長度最長的子陣列的長度。
輸入:a: [1,2,3,2,1]
b: [3,2,1,4,7]
輸出:3
解釋:長度最長的公共子陣列是 [3, 2, 1] 。
1 <= len(a), len(b) <= 1000
0 <= a[i], b[i] < 100
第 1 步:定義狀態
dp[i][j]
的含義是:對於a[1..i]
和b[1..j]
,它們的 最長重複子陣列 長度是dp[i][j]
,假設索引是從 1 開始的。
第 2 步:考慮狀態轉移方程
狀態轉移說簡單些就是做選擇,要求a
和b
的最長重複子陣列,不妨稱這個子陣列為lrs(longest repeating subarray )
。那麼對於a
和b
中的每個元素,有什麼選擇?很簡單,兩種選擇,要麼在lrs
中,要麼不在。
應該如何選擇呢?
用兩個指標i
和j
從後往前遍歷a
和b
,如果a[i]==b[j]
,那麼這個字元一定在lrs
中;否則的話,a[i]
和b[j]
這兩個元素至少有乙個不在lrs
中,。
對於第一種情況,找到乙個lrs
中的字元,同時將i
j
向前移動一位,並給lrs
的長度加一;對於後者,則dp[i][j]
置為0,重新計數。
因此,dp[i] [j]
的狀態轉移方程是:
d p[
i][j
]=
1 + dp[i-1][j-1],a[i - 1] == b[j - 1]\\ 0,其他\\ \end
dp[i][
j]=else
ans = math.
max(ans,dp[i]
[j]);}
}return ans;
}}複雜度分析:
leetcode 718 最長重複子陣列
給兩個整數陣列a和b,返回兩個陣列中公共的 長度最長的子陣列的長度。輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3解釋 長度最長的公共子陣列是 3,2,1 動態規劃 dp i j a 0,i 和b 0,j 的最長重複子陣列 狀態轉移方程 python class solution d...
LeetCode 718 最長重複子陣列
給兩個整數陣列 a 和 b 返回兩個陣列中公共的 長度最長的子陣列的長度。示例 1 輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3 解釋 長度最長的公共子陣列是 3,2,1 說明 1 len a len b 1000 0 a i b i 100 lci問題,沒什麼好說的就是寫就完事了...
leetcode 718 最長重複子陣列
給兩個整數陣列 a 和 b 返回兩個陣列中公共的 長度最長的子陣列的長度。示例 1 輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3 解釋 長度最長的公共子陣列是 3,2,1 說明 1 len a len b 1000 0 a i b i 100 解題思路 定義dp i j 表示以a ...