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
Solutions
My solution
classSolution {public:intfindLength(vector<int>& A,vector<int>& B) {int n =A.size();int m =B.size();if(n ==0|| m ==0) return0; // dp[i][j]: length of the longest common subarray of A[0..i] and B[0..j] ending with A[i] and B[j] vector<vector<int>>dp(n,vector<int>(m));int len =0;for(int j =0; j < m; ++j){if(A[0] ==B[j]){ len =dp[0][j] =1; } }for(int i =0; i < n; ++i){if(A[i] ==B[0]){ len =dp[i][0] =1; } }for(int i =1; i < n; ++i){for(int j =1; j < m; ++j){if(A[i] ==B[j]){dp[i][j] =dp[i -1][j -1] +1; len =max(len,dp[i][j]); } } }return len; }};
More concise implementation
classSolution {public:intfindLength(vector<int>& A,vector<int>& B) {int n =A.size();int m =B.size(); // dp[i][j]: length of longest common subarray of A[0..i-1] and B[0..j-1] ending with A[i-1] and B[j-1] vector<vector<int>>dp(n +1,vector<int>(m +1));int len =0;for(int i =1; i <= n; ++i){for(int j =1; j <= m; ++j){if(A[i -1] ==B[j -1]){dp[i][j] =dp[i -1][j -1] +1; len =max(len,dp[i][j]); } } }return len; }};