Description
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
解题思路
本题求最长公共子数组问题,可采用最容易想到的遍历匹配方法求解
int findLength(vector<int>& A, vector<int>& B) {
int max = 0;
int count = 0;
int j = 0;
int lengthA = A.size();
int lengthB = B.size();
for (int i = 0; i < lengthA; ++i) {
count = 0;
j = 0;
if (lengthA - i <= max) break;
while (j != lengthB) {
if (i + count < lengthA && j + count < lengthB && A[i + count] == B[j + count]) {
++count;
} else {
if (max < count) {
max = count;
}
count = 0;
++j;
}
}
}
return max;
}
本题中有很多重复子问题,也可用动态规划进行求解
动态方程为
dp[i][j] = dp[i - 1][j - 1] + 1;
返回结果为
max = dp[i][j] > max ? dp[i][j] : max;
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int len1 = A.size();
int len2 = B.size();
int max = 0;
//初始化赋值为0
vector<vector<int>> dp(len1+1, vector<int>(len2+1,0));
for(int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (A[i-1] == B[j-1]) {
dp[i][j] = dp[i-1][j-1]+1;
max = dp[i][j] > max ? dp[i][j] :max;
}
}
}
return max;
}
};