leetcodeの動的なプログラミングノート5つのダブルシーケンスタイプ---

コンセプト

クラスの複数の配列。

タイトル

最長の回文サブシーケンス

方法:再帰+メモ
方法2:再帰+メモ
間隔DP練習
リファレンス

class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp  = new int[len][len];
        
        for(int i = len - 1; i >= 0; i --){
            
            dp[i][i] = 1;
            
            for(int j = i + 1; j < len; j ++){
                
                if(s.charAt(i) == s.charAt(j)){
                    dp[i][j] = dp[i+1][j-1] + 2;
                }
                else{
                    dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
                }
            }
            
        }
        
        return dp[0][len - 1];
    }
}

方法3:再帰+メモ
-ビス型配列の練習は、この問題はLCSに変換することができます:単一の文字列の最長の回文配列は、文字列は最長共通部分、元の配列を求めた後、反転しています。

class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp  = new int[len+1][len+1];
        
        String r = new StringBuffer(s).reverse().toString();
        
        for(int i = 0; i <= len; i ++){
            dp[0][i] = 0;
            dp[i][0] = 0;
        }
        
        for(int i = 1; i <= len; i ++){
            
            for(int j = 1; j <= len; j ++){
                if(s.charAt(i-1) == r.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                else{
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
                }
            }
        }
        
        return dp[len][len];
    }
}

712最小ASCII 2つの文字列のために合計を削除します。

この方法の一つ

class Solution {
    public int minimumDeleteSum(String s1, String s2) {
        char[] arr1 = s1.toCharArray();
        char[] arr2 = s2.toCharArray();
        
        int[][] dp = new int[arr1.length+1][arr2.length+1];
        
        for(int i = 0; i <= arr1.length; i ++){
            
            for(int j = 0; j <= arr2.length; j++){
                
                if(i == 0 && j == 0){
                    dp[0][0] = 0;
                }
                else if(i == 0){
                    dp[i][j] = dp[i][j-1] + arr2[j-1];
                }
                else if(j == 0){
                    dp[i][j] = dp[i-1][j] + arr1[i-1];
                }
                else{
                    if(arr1[i-1] == arr2[j-1]){
                        dp[i][j] = dp[i-1][j-1];
                    }
                    else{
                        dp[i][j] = Math.min(dp[i-1][j] + arr1[i-1], dp[i][j-1] + arr2[j-1]);
                    }
                }   
            }
        }
        
        return dp[arr1.length][arr2.length];
    }
}

繰り返し部分配列の718最大長

方法の一つ:再帰+メモ
、彼はその理由を慎重に比較して、明確な状態との関係ではないことを、この質問Longest Common Subsequence

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

方法2:暴力的なソリューション
grandyang暴力的な解決策のアイデアは、実際には同じではありません

おすすめ

転載: www.cnblogs.com/holidays/p/leetcode_note5.html
おすすめ