給兩個整數陣列 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[i]和b[j]為結尾的公共子陣列的最長長度(注意公共子陣列一定分別包含a[i]和b[j]作為末元素,模擬最大子段和問題)
當a[i]!=b[j]時,dp[i][j]=0, 因為以a[i]和b[j]結尾的公共子陣列不存在,因為它們的末元素不等
當a[i]==b[j]時,dp[i][j]=dp[i-1][j-1]+1, 因為a[i]和b[j]相等,以它們倆為結尾的最長公共子陣列的長度就是以a[i-1]和b[j-1]結尾的最長公共子陣列的長度加1
之所以這樣定義狀態是因為原問題所要求的最長公共子陣列如果存在,它一定是以某乙個a的元素結尾,也以某乙個b的元素結尾,現在就是遍歷所有可能的分別以哪兩個元素結尾的情況,取其中的最長的情況即可
模擬1143.最長公共子串行問題:因為該問題中是子陣列,元素要求是連續的,所以當a[i]!=b[j]時,直接置dp[i][j]=0即可,此時以a[i]和b[j]結尾的最長子陣列壓根不存在,而最長公共子串行問題中,即使a[i]!=b[j],也要將前面求出來的最長子序列長度繼承下來
時間複雜度o(n^2)
class solution
else
}return max;
}};
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逐漸全部走進序列b。2.序列a完全在b中滑動。3.序列a逐漸離開b class solution def...