1. 程式人生 > 其它 >LeetCode97. 交錯字串

LeetCode97. 交錯字串

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 連線。
     * 
     */

思路分析

  1. 驗證s3是否是由s1, s2交錯組成的,首先需要明白交錯的含義
  2. 可以使用動態規劃的思路,建立一個二維動態規劃陣列,用來記錄從s1中取出i個字元,從s2中取出j個字元後是否可以交錯組成s3的前 i + j位
  3. 即如果字串1的第i位如果等於字串3的第p位,則字串1的第i - 1位和字串2的第j位就可以交錯組成字串3的第 p - 1位
  4. 字串2也同理
  5. 原始碼見下

原始碼及分析

/**
     *
     * @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];
    }