20200625
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
当想要知道长n的字符串S是否满足是,默认已经知道了前n个字符组合的结果,这样追溯一直会追溯到长0
当前n个字母结果与剩余字符组合在wordDict则满足条件
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
let _result = new Array(s.length + 1).fill(false);
_result[0] = true;
for (let i = 0; i <= s.length; i++) {
for (let j = 0; j < i; j++) {
if (_result[j] && wordDict.includes(s.substring(j, i))) {
_result[i] = true;
break
}
}
}
return _result[s.length]
};
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boolean}
*/
var wordBreak = function(s, wordDict) {
const wordSet = new Set(wordDict);
const memo = new Array(s.length);
const check = (s, wordSet, start, memo) => {
if (start > s.length - 1) return true;
if (memo[start] !== undefined) return memo[start];
for (let end = start + 1; end <= s.length; end++) {
const word = s.slice(start, end);
if (wordSet.has(word) && check(s, wordSet, end, memo)) {
memo[start] = true;
return true;
}
}
memo[start] = false;
return false;
};
return check(s, wordSet, 0, memo);
};
博客: 小书童博客(http://gaowenju.com)
公号: 坑人的小书童