97. 交错字符串

97 阅读1分钟

image.png

dp

  • dp[i][j] 表示s1的前i个字符和s2的前j个字符能否组成s3的前i+j个字符,注意不是index
class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int l1 = s1.length(), l2 = s2.length(), l3 = s3.length();
        // 长度不匹配,直接false
        if (l1 + l2 != l3) {
            return false;
        }
        boolean[][] dp = new boolean[l1 + 1][l2 + 1];
        // 初始化,显然为true
        dp[0][0] = true;
        //初始化,s1 的前 i 位是否能构成 s3 的前 i 位,遇到 false 后面可以直接省略
        for (int i = 1; i <= l1 && s1.charAt(i - 1) == s3.charAt(i - 1); i++) {
            dp[i][0] = true;
        }
        //初始化,s2 的前 j 位是否能构成 s3 的前 j 位,遇到 false 后面可以直接省略
        for (int j = 1; j <= l2 && s2.charAt(j - 1) == s3.charAt(j - 1); j++) {
            dp[0][j] = true;
        }
        for (int i = 1; i <= l1; i++) {
            for (int j = 1; j <= l2; j++) {
                // 注意index的计算,i+j-1
                dp[i][j] = (dp[i][j - 1] && (s2.charAt(j - 1) == s3.charAt(i + j - 1))) 
                    || (dp[i - 1][j] && (s1.charAt(i - 1) == s3.charAt(i + j - 1)));
            }
        }
        return dp[l1][l2];
    }
}