給兩個整數陣列a
和b
,返回兩個陣列中公共的、長度最長的子陣列的長度。
目錄
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...