题目
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].
分析
这题也是dp的方法,一开始我的思路是跟edit distance比较像,就是通过一个二维的矩阵,然后取子串,不断地累加,最后的dp[m][n] 就是最大值。后来发现不行。因为这样就无法记录是不是开始了一个新的子串,在后续的比较中,无法判断是否之前已经重新开了个子串,因此只能退而求其次,将dp[i][j] 的意思变为,对于A.substring[i]和B.substring[j],当前的A[i]和B[j]是当前在计算的重复子串的第几个元素。如果当前的A[i],B[j]不在重复子串中,那么则为0。 最后考虑dp[i][j] 中最大的那个值,就是最长重复子串的长度。注意,每个dp[i][j]都是只依赖于 dp[i-1][j-1]的。
时间复杂度分析
时间复杂度显而易见,为了填充一个二维矩阵,需要消耗O(
代码
class Solution {
public:
int findLength(vector<int>& A, vector<int>& B) {
int m = A.size(), n = B.size(), maxLength = 0;
int** dp = new int*[m+1];
for (int i = 0; i < m + 1; i++) {
dp[i] = new int[n+1];
memset(dp[i], 0, sizeof(int)*(n+1));
}
for (int i = 1; i < m +1; i++) {
for (int j = 1; j < n + 1; j++) {
if (A[i - 1] == B[j - 1]) {
dp[i][j] = dp[i - 1][j-1] +1;
maxLength = max(dp[i][j], maxLength);
}
}
}
for (int i = 0; i < m + 1; i++) {
delete []dp[i];
}
delete []dp;
return maxLength;
}
};