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;
   }
}

 

 

posted @ 2021-03-29 19:41  yfy刷题  阅读(58)  评论(1)    收藏  举报