字串左側補0_LeetCode題記——97交錯字串
阿新 • • 發佈:2021-01-05
技術標籤:字串左側補0
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建立動態規劃陣列,
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]; }
程式碼執行情況: