718 最長重複子陣列

2021-10-07 16:21:57 字數 977 閱讀 7496

題目描述:

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

示例 1:

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

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

輸出: 3

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

題目分析:這道題和兩個字串的最長公共子串行類似,不同之處在於子陣列是連續的,那麼只需要改變一下遞推公式即可,要求連續,因此在判斷相同時累加,否則就直接賦值0(不同於最長公共子串行的取前面序列的最大值),這樣才能保證連續性

假設兩個陣列分別為:

[1,2,3,4,2]

[2,3,2,1,4]

簡單畫下**來對比一下吧

如果是最長子陣列,max則為2(2,3)

dp[i][j] = a[i-1] == b[j-1] ? dp[i - 1][j - 1] + 1 : 0;

i/j123

4220

1001

3002

0020

1001

1100

0040

0010

如果是最長子序列,max則為3(2,3,2/2,3,4)

if(a[i-1]==b[j-1])

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

else

dp[i][j] = math.max(dp[i-1][j],dp[i][j-1]);

i/j123

4220

1111

3012

2320

1223

1112

2340

1233

對比可以看到,連續子陣列只要求對角線上的值

**:

class

solution

}return ans;

}}

這裡把我寫過的最長子序列貼一下方便對比:

最長子序列

718 最長重複子陣列

給兩個整數陣列a和b,返回兩個陣列中公共的 長度最長的子陣列的長度。目錄 1 題目分析 2 解題分析 3 示例 1 輸入 a 1,2,3,2,1 b 3,2,1,4,7 輸出 3 解釋 長度最長的公共子陣列是 3,2,1 求兩個陣列公共的子陣列的長度,那麼可以用較短的那個字串去匹配長的字串,使用列舉...

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 返回兩個陣列中公共的 長度最長的子陣列的長度。示例 輸入 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...