97 Interleaving String

判断s3是否由s1和s2交织组成,动态规划求解,faster than 71%

dp[i - 1][j] == true && s1.charAt(i - 1) === s3.charAt(i + j - 1)
dp[i][j - 1] == true && s2.charAt(j - 1) === s3.charAt(i + j - 1)

dp[i][j] = true 表示s1的前i个字符与s2的前j个字符可以交织组成s3的i + j 个字符

即s1的前i - 1个字符与s2的前j个字符可以交织组成s3的i + j 个字符,若s1的第 i - 1个字符与s3的前 i + j - 1个字符相等,这个多1是考虑空字符串的情况。

/**
 * @param {string} s1
 * @param {string} s2
 * @param {string} s3
 * @return {boolean}
 */
var isInterleave = function(s1, s2, s3) {
    if(s1.length + s2.length !== s3.length) return false
    var dp = Array(s1.length + 1).fill().map(item => Array(s2.length + 1).fill(false))
    dp[0][0] = true
    for(var i = 1; i < s1.length + 1; i++){
        dp[i][0] = dp[i - 1][0] && (s1[i - 1] === s3[i - 1])
    }
    for(var j = 1; j < s2.length + 1; j++){
        dp[0][j] = dp[0][j - 1] && (s2[j - 1] === s3[j - 1])
    }
    for(var i = 1; i < s1.length + 1; i++){
        for(var j = 1; j < s2.length + 1; j++){
            if(dp[i - 1][j] == true && s1.charAt(i - 1) === s3.charAt(i + j - 1)) dp[i][j] = true
            if(dp[i][j - 1] == true && s2.charAt(j - 1) === s3.charAt(i + j - 1)) dp[i][j] = true
        }
    }
    return dp[s1.length][s2.length]
};

你可能感兴趣的:(97 Interleaving String)