LeetCode97. 交錯字串
阿新 • • 發佈:2021-06-20
LeetCode97. 交錯字串
題目描述
/** * * 給定三個字串s1、s2、s3,請你幫忙驗證s3是否是由 * s1和s2 交錯 組成的。 * <p> * 兩個字串 s 和 t 交錯 的定義與過程如下, * 其中每個字串都會被分割成若干 非空 子字串: * <p> * s = s1 + s2 + ... + sn * t = t1 + t2 + ... + tm * |n - m| <= 1 * 交錯 是 s1 + t1 + s2 + t2 + s3 + t3 + ... * 或者 t1 + s1 + t2 + s2 + t3 + s3 + ... * 提示:a + b 意味著字串 a 和 b 連線。 * */
思路分析
- 驗證s3是否是由s1, s2交錯組成的,首先需要明白交錯的含義
- 可以使用動態規劃的思路,建立一個二維動態規劃陣列,用來記錄從s1中取出i個字元,從s2中取出j個字元後是否可以交錯組成s3的前 i + j位
- 即如果字串1的第i位如果等於字串3的第p位,則字串1的第i - 1位和字串2的第j位就可以交錯組成字串3的第 p - 1位
- 字串2也同理
- 原始碼見下
原始碼及分析
/** * * @param s1 字串1 * @param s2 字串2 * @param s3 字串3 * @return */ public boolean isInterleave(String s1, String s2, String s3) { //記錄三個字串的長度 int m = s1.length(), n = s2.length(), t = s3.length(); //如果s1的長度+s2的長度不等於s3的長度 if (m + n != t) { return false; } //定義動態規劃陣列 boolean[][] is = new boolean[m + 1][n + 1]; //邊界條件 is[0][0] = true; //掃描第一個字串 for (int i = 0; i <= m; i++) { //掃描第二個字串 for (int j = 0; j <= n; j++) { int p = i + j - 1; //如果第三個字串的第 p 位字元等於第一個字元的 第i位字元 if (i > 0 && s3.charAt(p) == s1.charAt(i - 1)) { is[i][j] = is[i][j] || is[i - 1][j]; } //如果第三個字串的第 p 位字元等於第二個字元的 第j位字元 if (j > 0 && s3.charAt(p) == s2.charAt(j - 1)) { is[i][j] = is[i][j] || is[i][j - 1]; } } } return is[m][n]; }