Leetcode[718].最长重复子数组
思路
思路参考自:
https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/solution/zui-chang-zhong-fu-zi-shu-zu-by-leetcode-solution/
方法一:动态规划

class Solution {
public int findLength(int[] A, int[] B) {
int aLen = A.length, bLen = B.length;
int[][] db = new int[aLen + 1][bLen + 1];
int ans = 0;
//从左往右遍历两个数组,寻找最长公共子串
for(int i = aLen - 1;i >= 0;i--){
for(int j = bLen - 1;j >= 0;j--){
//如果A[i] == B[j],此时公共前缀数量+1
db[i][j] = A[i] == B[j] ? db[i + 1][j + 1] + 1 : 0;
ans = Math.max(ans, db[i][j]);
}
}
return ans;
}
}
方法二:滑动窗口

class Solution { //找出AB数组每一种可能的对齐位置 public int findLength(int[] A, int[] B){ int m = A.length, n = B.length; int result = 0; //此时A不动,B的首元素依次与A的各个元素对齐 for(int i = 0;i < m;i++){ int len = Math.min(m - i,n); int maxLen = maxLength(A, B, i, 0, len); result = Math.max(result, maxLen); } //此时B不动,A的首元素依次与B的各个元素对齐 for(int i = 0;i < n;i++){ int len = Math.min(n - i,m); int maxLen = maxLength(A, B, 0, i, len); result = Math.max(result, maxLen); } return result; } //寻找数组A从addA位置和数组B从addB位置开始在len长大衣内最长的公共子串 public int maxLength(int[] A,int[] B, int i, int j, int len){ int res = 0,temp = 0; for(int k = 0;k < len;k++){ if(A[i + k] == B[j + k]){ temp++; }else{ temp = 0; } res = Math.max(res, temp); } return res; } }

浙公网安备 33010602011771号