題目
Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays.
Example 1:
Input:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
Output: 3
Explanation:
The repeated subarray with maximum length is [3, 2, 1].
Note:
- 1 <= len(A), len(B) <= 1000
- 0 <= A[i], B[i] < 100
解題思路
使用動態規劃的思想,一開始最容易想到的就是設 f[i]
爲以數字 A[i]
爲結尾的最大公共子串的長度。假設 A[i - 1]
在 B
中的位置爲 j
,則有 f[i] = f[i - 1] + 1
當且僅當 A[i - 1] == B[j - 1]
。顯然,我們必須考慮 A
中的元素在 B
中的位置這一個約束,因此需要把動態規劃的數組加多一個維度:令 f[i][j]
表示以 A[i]
或 B[j]
爲結尾的最大公共子串的長度(A[i] == B[j]
時纔有效),這樣狀態轉移方程就出來了:
最後,求得
在實現的過程中,爲了防止
i - 1
和 j - 1
導致數組下標溢出,且爲了初始化的方便,我們讓 i
和 j
從 1
開始計數,而 dp[0][j] = 0
且 dp[i][0] = 0
( dp[0][j] = 0
表示 A
數組中沒有一個數字去和 B
中的數字匹配,dp[i][0]
同理)。
C++代碼實現
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int m = A.size(), n = B.size();
int rst = 0;
int dp[1000 + 1][1000 + 1] = { 0 };
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; ++j) {
if (i == 0 || j == 0) { continue; }
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
rst = max(dp[i][j], rst);
}
}
}
return rst;
}
};