給兩個整數陣列 a 和 b ,返回兩個陣列中公共的、長度最長的子陣列的長度。
首先想到的就是滑動法,就像卷積一樣,其中乙個序列從另乙個陣列的左邊一直滑到右邊,然後交疊部分挨個比較。
分三部分:1. 序列a逐漸全部走進序列b。2. 序列a完全在b中滑動。3.序列a逐漸離開b
class
solution
:def
findlength
(self, a: list[
int]
, b: list[
int])-
>
int:
m =len(a)
n =len(b)
if m>n:
m, n, a, b = n, m, b, a
# a smaller, 預設是b在滑動,即長的序列參照a滑動
cnt =
0for i in
range(1
, m+1)
:# 第一部分
cnt =
max(cnt, self.count(a,
0, b, n-i, i)
)for i in
range
(n-m-1,
-1,-
1):# 第二部分
cnt =
max(cnt, self.count(a,
0, b, i, m)
)for i in
range(1
, m)
:# 第三部分
cnt =
max(cnt, self.count(a, i, b,
0, m-i)
)return cnt
defcount
(self, a, i, b, j, leng)
: cnt =
0 max_cnt =
0for k in
range
(leng)
:if a[i+k]
== b[j+k]
: cnt +=
1 max_cnt =
max(max_cnt, cnt)
else
: cnt =
0return max_cnt
dp[i][j] 代表以a[i] 和b[i]為起點的a[i:], b[i:],他們的最長公共子陣列的數目。所以遞迴方程為
當a[i] == b[i],說明可以在dp[i+1][j+1]的基礎上加1,代表以a[i]為起點的公共子樹組的長度。如果不相等,則為0.
最後返回的就是dp的每一行的最大值的最大值。
class
solution
:def
findlength
(self, a: list[
int]
, b: list[
int])-
>
int:
m =len(a)
n =len(b)
dp =[[
0]*(n+1)
for _ in
range(1
+m)]
for i in
range
(m-1,-
1,-1
):for j in
range
(n-1,-
1,-1
):if a[i]
== b[j]
: dp[i]
[j]= dp[i+1]
[j+1]+
1return
max(
max(row)
for row in dp)
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 ...