140. 单词拆分 II

99 阅读1分钟

140. 单词拆分 II

回溯

  • var set = new Set(wordDict); 转换为set结构
  • var memo = new Array(len); 构建记录数组
  • var arr = f(0) 返回从0到最后的字符串所有的拆分组合
  • if (memo[i]) return memo[i]; 如果在执行f(k)时,在memo中存在过,说明之前已经处理过了就不用重复处理了,直接返回结果就行
  • if (i === s.length) return [[]]; 如果f(s.length) 说明到了最后一个字符了,于是直接返回一个空结果就行了
  • for (var j = i + 1; j <= len; j++) { 遍历j = i+1 ~ len
  • var word = s.slice(i, j); 截取字符串 [ i , i + 1 ~ len ]
  • if (set.has(word)) { 在字典中查找
  • for (var next of f(j)) { 将f(i+1)...f(len)

image.png

function wordBreak(s, wordDict) {
    var len = s.length;
    var set = new Set(wordDict);
    var memo = new Array(len);
    var arr = f(0)
    return arr.map((words) => {
        return words.join(' ');
    });
    function f(i) {
        if (memo[i]) return memo[i];
        if (i === s.length) return [[]];
        var res = [];
        for (var j = i + 1; j <= len; j++) {
            var word = s.slice(i, j);
            if (set.has(word)) {
                for (var next of f(j)) {
                    res.push([word].concat(next));
                }
            }
        }
        memo[i] = res;
        return res;
    }
}
var s = "catsanddog", wordDict = ["cat", "cats", "and", "sand", "dog"]
console.log(wordBreak(s, wordDict));