Skip to content

Code:

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

    let dp = []
    let set = new Set()
    
    const dfs = (i1 = 0, i2 = 0, i = 0) => {
        if (set.has(`${i1}-${i2}`)) {
            return
        }

        if (i >= s3.length) {
            return
        }
        
        set.add(`${i1}-${i2}`)

        if (i1 < s1.length && s1[i1] === s3[i]) {
            dp[i] = true
            dfs(i1 + 1, i2, i + 1)
        }

        if (i2 < s2.length && s2[i2] === s3[i]) {
            dp[i] = true
            dfs(i1, i2 + 1, i + 1)
        }

        return dp[i] = dp[i] || false
    }

    dfs();

    while(dp.length && !dp.pop()) {
        return false
    };

    return true
}


// dfs 优化
var isInterleave = function(s1, s2, s3) {
    if (s1.length + s2.length !== s3.length) {
        return false
    }

    const map = new Map()

    const dfs = (i = 0, j = 0) => {
        if (map.has(`${i}-${j}`)) {
            return map.get(`${i}-${j}`)
        }

        if (i + j >= s3.length) {
            return true
        }

        let boolean = false

        if (i < s1.length && s1[i] === s3[i + j]) {
            boolean = dfs(i + 1, j)
        }

        if (j < s2.length && s2[j] === s3[i + j]) {
            boolean = boolean || dfs(i, j + 1)
        }

        return map.set(`${i}-${j}`, boolean).get(`${i}-${j}`)
    }

    return dfs()
}


// dp




console.log(isInterleave("aabcc", "dbbca", "aadbbbaccc"))

❤ With Algorithm