Skip to content

Code:

js
/**
 * @param {string} s
 * @return {string[][]}
 */
var partition = function (s) {
    let res = []
    let path = []
    let n = s.length

    // 普通检查
    const fn = (i, j) => {
        while(i < j) {
            if (s[i++] !== s[j--]) {
                return false
            }
        }

        return true
    }

    const dp = Array.from({ length: n }, () => Array(n).fill(false))

    // dp优化
    for (let i = n - 1; i >= 0; i--) {
        for (let j = i; j < n; j++) {
            if (s[i] === s[j]) {
                if (j - i <= 2) {
                    dp[i][j] = true
                } else {
                    dp[i][j] = dp[i + 1][j - 1]
                }
            }
        }
    }

    const dfs = (start = 0) => {
        if (start === s.length) {
            return res.push([...path])
        }

        for (let i = start; i < s.length; i++) {
            if (dp[start][i]) {
                path.push(s.slice(start, i + 1))
                dfs(i + 1)
                path.pop()
            }
        }
    }


    dfs()

    return res
};


console.log(partition('aab'))

❤ With Algorithm