LeetCode #718 Maximum Length of Repeated Subarray

題目

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. 1 <= len(A), len(B) <= 1000
  2. 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] 時纔有效),這樣狀態轉移方程就出來了:

f[i][j]={f[i1][j1]+1,0,if A[i] == B[j]otherwise

最後,求得 max{f[i][j]} 就是結果。
在實現的過程中,爲了防止 i - 1j - 1 導致數組下標溢出,且爲了初始化的方便,我們讓 ij1 開始計數,而 dp[0][j] = 0dp[i][0] = 0dp[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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章