1. 程式人生 > 其它 >字串左側補0_LeetCode題記——97交錯字串

字串左側補0_LeetCode題記——97交錯字串

技術標籤:字串左側補0

1a207da6ee7d2715447a66667132ce0a.png

LeetCode 97 交錯字串,難度:困難,標籤:前200

題意:

給定三個字串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。

示例 1:

輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"

輸出: true

示例 2:

輸入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"

輸出: false

思路:

動態規劃
但是比較難,用s2的長度+1建立動態規劃陣列,

然後針對i== 0 || j == 0,單獨處理,i == 0,只能j變化,從左側變化而來,所以s2變
j == 0,只能i變化,從上方變化而來,所以s1變
其他位置i != 0 && j != 0,都受左側和上方兩個位置影響,將左側結果 || 右側結果
90.96% , 14.29%

程式碼:

public static void main(String[] args) {
        String s1 = "aabcc";
        String s2 = "dbbca";
        String s3 = "aadbbcbcac";
        boolean res = isInterleave(s1 , s2 , s3);
        System.out.println(res);
    }
    public static boolean isInterleave(String s1, String s2, String s3) {
        if(s3.length() != s1.length() + s2.length()){
            return false;
        }
        int m = s1.length();
        int n = s2.length();
        // 建立動態規劃陣列
        boolean[] dp = new boolean[n + 1];
        for(int i = 0;i <= m ; i ++){
            for(int j = 0;j <= n; j ++){
                // i == 0 && j == 0單獨處理
                if(i == 0 && j == 0){
                    dp[j] = true;
                }
                // 當i == 0,畫圖即為第一行時,動態規劃只能從左側一步步推算出來
                else if(i == 0){
                    dp[j] = dp[j - 1] && (s2.charAt(j - 1) == s3.charAt(i + j - 1));
                }
                // 當 j == 0 ,畫圖即為第一列時,動態規劃只能從豎直的上方元素推算出來
                else if(j == 0){
                    dp[j] = dp[j] && (s1.charAt(i - 1) == s3.charAt(i + j - 1));
                }
                // i != 0 && j != 0 ,||左邊是判斷上方來的,因為上下相比,只是i變了,所以用s1比較,
                // ||右邊是判斷下方來的,左右相比,只是j變了,所以用s2比較
                else {
                    dp[j] = (dp[j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
                            (dp[j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
                }
            }
        }
        return dp[n];
    }

程式碼執行情況:

34c6f3ed5ec1c8a99f9928f0be4f7fa8.png