718 最長重複子陣列

2021-10-07 16:11:26 字數 1740 閱讀 5865

給兩個整數陣列ab,返回兩個陣列中公共的、長度最長的子陣列的長度。

目錄

1、題目分析

2、解題分析

3、**

示例 1:

輸入:

a: [1,2,3,2,1]

b: [3,2,1,4,7]

輸出: 3

解釋:

長度最長的公共子陣列是 [3, 2, 1]。

求兩個陣列公共的子陣列的長度,那麼可以用較短的那個字串去匹配長的字串,使用列舉法。像最長最短的往往都可以用動態規劃,不過要找出動態轉移方程來。

主要說一下滑窗法,選取較短的那個作為滑動的陣列。

最後返回更新的最大長度

class solution:

def findlength(self, a: list[int], b: list[int]) -> int:

# 動態規劃演算法

l1 = len(a)

l2 = len(b)

#dp[i][j]代表以a[i-1]與b[j-1]結尾的公共字串的長度,公共字串必須以a[i-1],b[j-1]結束

dp = [[0 for _ in range(l2+1)] for _ in range(l1+1)]

for i in range(1,l1+1):

for j in range(1,l2+1):

if a[i-1] == b[j-1]:

dp[i][j] = dp[i-1][j-1] + 1

return max(max(row) for row in dp)

'''3 2 1 4 7

1 0 0 1 0 0

2 0 1 0 0 0

3 1 0 0 0 0

2 0 2 0 0 0

1 0 0 3 0 0

'''#如果a或者b有乙個陣列是空的就直接返回none

if not a or not b:

return none

#如果a的長度是大於b的長度,那就交換一下,因為我想讓a當滑窗的那個陣列

if len(a)>len(b):

a,b = b,a

#對a和b做處理

a = [str(i) for i in a]

b = ','+','.join([str(i) for i in b])+','

# b:',3,2,1,4,7,'

# 為啥把b搞成這個鬼樣子呢?因為避免出現歧義

# 舉個例子a=[7] b=[17]

# temp = 7->',7,' 這樣就不會出現歧義,否則就這樣

# temp = 7->7, 因為b是字串呀,所以『7,』 in b中,這樣結果就出現誤判了

# 因此必須要把b和temp搞成',xx,x,x,xx,'這個鬼樣子

#初始化結果和乙個臨時陣列

res = 0

temp=

for i in a:

if ','+','.join(temp)+',' in b:

res = max(res,len(temp))

else:

temp = temp[1:]

return res

總結:這個題目應該是考察的動態規劃,但是在實際的操作中動態規劃的時間複雜度和空間複雜度更高。

718 最長重複子陣列

給兩個整數陣列 a 和 b 返回兩個陣列中公共的 長度最長的子陣列的長度。可以用dp i j 表示a陣列從i位置,b陣列從j位置開始的最長子陣列長度,由此可知,當a i b j 時,dp i j 取決與dp i 1 j 1 的結果,也即使dp i j dp i 1 j 1 1,當a i b j 時,...

718 最長重複子陣列

題目描述 給兩個整數陣列 a 和 b 返回兩個陣列中公共的 長度最長的子陣列的長度。示例 1 輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3 解釋 長度最長的公共子陣列是 3,2,1 題目分析 這道題和兩個字串的最長公共子串行類似,不同之處在於子陣列是連續的,那麼只需要改變一下遞推公...

718 最長重複子陣列

給兩個整數陣列 a 和 b 返回兩個陣列中公共的 長度最長的子陣列的長度。示例 輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3 解釋 長度最長的公共子陣列是 3,2,1 1.暴力生成所有子陣列,依次判斷。更直接的暴力。2.dp,dp i j 表示a i b j dp i j 1 dp...