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

在這裏插入圖片描述

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