718. 最长重复子数组
难度中等210
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
示例 1:
输入:
A: [1,2,3,2,1]
B: [3,2,1,4,7]
输出: 3
解释:
长度最长的公共子数组是 [3, 2, 1]。
**说明:**
1. 1 <= len(A), len(B) <= 1000
2. 0 <= A[i], B[i] < 100
//滑动窗口
class Solution {
public int findLength(int[] A, int[] B) {
int n = A.length;
int m = B.length;
int ret = 0;
for (int i = 0; i < n; i++) {
int len = Math.min(m,n-i);
int maxRet = findMaxRet(A, B, i, 0, len);
ret = Math.max(maxRet,ret);
}
for (int i = 0; i < m; i++) {
int len = Math.min(n,m-i);
int maxRet = findMaxRet(A, B, 0, i, len);
ret = Math.max(maxRet,ret);
}
return ret;
}
public int findMaxRet(int[] A,int[] B,int aindex,int bindex,int len){
int k = 0;
int ret = 0;
for (int i = 0; i < len; i++) {
if(A[aindex+i]==B[bindex+i]){
k++;
}
else{
k=0;
}
ret = Math.max(ret,k);
}
return ret;
}
}
//dp
class Solution {
public int findLength(int[] A, int[] B) {
int n = A.length;
int m = B.length;
int ret = 0;
int[][] dp = new int[n + 1][m + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
if (A[i] == B[j]) {
dp[i][j] = dp[i + 1][j + 1] + 1;
} else {
dp[i][j] = 0;
}
ret = Math.max(ret, dp[i][j]);
}
}
return ret;
}
}