LeetCode—最长重复子数组(DP)

最长重复子数组(中等)

2020年7月1日

题目来源:力扣

在这里插入图片描述

解题

刷了三个月简单题入门了一下,现在开始刷每日一题

这个最长重复子数组,用动态规划的方式比较好做,dp数组每次都记录是否相等,如果相等就在上一个数那里加一。

class Solution {
    public int findLength(int[] A, int[] B) {
        int max=0;
        int alen=A.length;
        int blen=B.length;
        int[][] dp=new int[alen+1][blen+1];
        for(int i=1;i<=alen;i++){
            for(int j=1;j<=blen;j++){
                if(A[i-1]==B[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                    max=Math.max(max,dp[i][j]);
                }
            }
        }
        return max;
    }
}

在这里插入图片描述

  • DP二维数组改一维数组

由二维数组可知,dp[i][j]=dp[i-1][j-1]+1。那么可以发现这个矩形是斜线递增的,而且每次都只是依赖上一行的数据,那么改写成一维数组,这里要注意,后面的数据是依赖于前面的数据,前面的数据是用来推导后面的数据,所以前面的数据不依赖后面的数据,我们就需要从后面开始对比,以免影响结果。
还有因为是一维数组,所以不相等的要实时刷新为0。

class Solution {
    public int findLength(int[] A, int[] B) {
        int max=0;
        int alen=A.length;
        int blen=B.length;
        int[] dp=new int[blen+1];
        for(int i=1;i<=alen;i++){
            for(int j=blen;j>=1;j--){
                if(A[i-1]==B[j-1]){
                    dp[j]=dp[j-1]+1;
                    max=Math.max(max,dp[j]);
                }
                else
                    dp[j]=0;
            }
        }
        return max;
    }
}

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章