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 <= len(A), len(B) <= 1000
- 0 <= A[i], B[i] < 100
1.解析
题目大意,求解最长的连续公共子序列。
2.分析
本题考查的思想和公共子序列思想很类似,只是做了小的改动,将不连续的改成了连续的。然而,我就卡在了如何解决连续的问题上,又是一道不会举一反三的实例。参考@Grandyang博主的思路,其实就是在检测到当前两个数组的元素不一样的时候,将当前统计长度的dp数组置0即可。因为是要求连续的子序列,所以,若当前出现不一样的字符,意味着下一次就得重新统计。
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int m = A.size(), n = B.size(), res = 0;
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= A.size(); ++i){
for (int j = 1; j <= B.size(); ++j){
if (A[i-1] == B[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
res = max(res, dp[i][j]); //这里要实时更新,因为最大值不一定会出现在dp[m][n]上
}
else dp[i][j] = 0; //若当前出现的两个字符不匹配,则重新开始统计
}
}
return res;
}
};