回溯
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 ~ lenvar word = s.slice(i, j);截取字符串[ i , i + 1 ~ len ]if (set.has(word)) {在字典中查找for (var next of f(j)) {将f(i+1)...f(len)
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));