文章目录
最长重复子数组
https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/
给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
思路1:DP
// 动态规划
class Solution {
public int findLength(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return 0;
}
int len1 = nums1.length;
int len2 = nums2.length;
int[][] dp = new int[len1 + 1][len2 + 1];
int res = -1;
for (int i = len1 - 1; i >= 0; i--) {
for (int j = len2 - 1; j >= 0; j--) {
if (nums1[i] == nums2[j]) {
// 这里的DP方程,我真的是 没理解。。。。
dp[i][j] = dp[i + 1][j + 1] + 1;
} else {
dp[i][j] = 0;
}
res = Math.max(res, dp[i][j]);
}
}
return res;
}
}
- 时间:O(m*n)
- 空间:O(m*n)
思路2:滑动窗口(具体思路见题解)
class Solution02 {
public int findLength(int[] A, int[] B) {
int n = A.length, m = B.length;
int ret = 0;
// 数组 B 不动, A 动
for (int i = 0; i < n; i++) {
int len = Math.min(m, n - i);
int maxlen = maxLength(A, B, i, 0, len);
ret = Math.max(ret, maxlen);
}
// 数组 A 不动, B 动
for (int i = 0; i < m; i++) {
int len = Math.min(n, m - i);
int maxlen = maxLength(A, B, 0, i, len);
ret = Math.max(ret, maxlen);
}
return ret;
}
// 求长度 len 中最长相等的长度
public int maxLength(int[] A, int[] B, int addA, int addB, int len) {
int ret = 0, k = 0;
for (int i = 0; i < len; i++) {
if (A[addA + i] == B[addB + i]) {
k++;
} else {
k = 0;
}
ret = Math.max(ret, k);
}
return ret;
}
}
- 时间:O((m+n)*min(m,n))
- 空间:O(1)