🙁97 interleaving string

https://leetcode.com/problems/interleaving-string/submissions/

方法还是挺简单的,就是可能会踩坑,首先很多种i和j都能组成相同长度的i+j,所以just because当前的s1[:i]和s2[:j]不能组成s3[:i+j],不能说明其他的ij组合不能,所以不能立马返回

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int m = s1.length();
        int n = s2.length();
        if (s3.length() != m + n) return false;
        // dp[i][j] shows wether s1[0 - i] and s2[0 - j] can interleave to become s3[0 - i + j]
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        for (int i = 1; i <= m; i++) {
            dp[i][0] = s1.charAt(i - 1) == s3.charAt(i - 1) ? dp[i - 1][0] : false;
        }
        for (int i = 1; i <= n; i++) {
            dp[0][i] = s2.charAt(i - 1) == s3.charAt(i - 1) ? dp[0][i - 1] : false;
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                char ch1 = s1.charAt(i - 1);
                char ch2 = s2.charAt(j - 1);
                char ch3 = s3.charAt(i + j - 1);
                // 不能写在一起,要相对应匹配 不能ch1 == ch3 && dp[i][j - 1]
                // if (ch1 == ch3 || ch2 == ch3) {
                //     dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
                // } else {
                    // 仅仅因为当前没有匹配的不能提前返回
                    // 因为长度为len的s3有很多种i,j组合方式,有一个可以就行
                //     dp[i][j] = false;
                // }
                
                dp[i][j] = (ch1 == ch3 && dp[i - 1][j]) || (ch2 == ch3 && dp[i][j - 1]);
            }
        }
        return dp[m][n];
    }
}

Last updated