LeetCode 718 最長重複子陣列

2021-10-07 04:02:09 字數 1914 閱讀 5233

給兩個整數陣列 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 ...