var wordBreak = (s, wordDict) => {
const wordSet = new Set(wordDict);
return canBreak(s, wordSet);
};
var canBreak = (s, wordSet, start = 0) => {
const isBaseCase = (start === s.length);
if (isBaseCase) return true;
return dfs(s, wordSet, start);
}
var dfs = (s, wordSet, start) => {
for (let end = (start + 1); end <= s.length; end++) {
const word = s.slice(start, end);
const _canBreak = wordSet.has(word)
&& canBreak(s, wordSet, end);
if (_canBreak) return true;
}
return false;
}
var wordBreak = (s, wordDict) => {
const wordSet = new Set(wordDict);
const memo = new Array(s.length).fill(null);
const start = 0;
return canBreak(s, wordSet, start, memo);
}
var canBreak = (s, wordSet, start, memo) => {
const isBaseCase1 = (s.length === start);
if (isBaseCase1) return true;
const hasSeen = (memo[start] !== null);
if (hasSeen) return memo[start];
return dfs(s, wordSet, start, memo);
}
var dfs = (s, wordSet, start, memo) => {
for (let end = (start + 1); (end <= s.length); end++) {
const word = s.slice(start, end);
const _canBreak = wordSet.has(word)
&& canBreak(s, wordSet, end, memo);
if (_canBreak) {
memo[start] = true;
return true;
}
}
memo[start] = false;
return false;
}
var wordBreak = (s, wordDict) => {
const wordSet = new Set(wordDict);
const tabu = initTabu(s);
canBreak(s, wordSet, tabu);
return tabu[s.length];
}
const initTabu = (s) => {
const tabu = new Array((s.length + 1)).fill(false);
tabu[0] = true;
return tabu;
}
var canBreak = (s, wordSet, tabu) => {
for (let end = 1; (end <= s.length); end++) {
checkWord(s, wordSet, end, tabu);
}
}
var checkWord = (s, wordSet, end, tabu) => {
for (let start = 0; (start < end); start++) {
const word = s.slice(start, end);
const canBreak = tabu[start] && wordSet.has(word);
if (!canBreak) continue;
tabu[end] = true;
return;
}
}
var wordBreak = function(s, wordDict) {
const wordSet = new Set(wordDict);
const queue = new Queue([ 0 ]);
const seen = new Array(s.length).fill(false);
return bfs(queue, s, wordSet, seen);
}
const bfs = (queue, s, wordSet, seen) => {
while (!queue.isEmpty()) {
for (let level = (queue.size() - 1); (0 <= level); level--) {
if (canWordBreak(queue, s, wordSet, seen)) return true;
}
}
return false;
}
var canWordBreak = (queue, s, wordSet, seen) => {
const start = queue.dequeue();
const hasSeen = seen[start];
if (hasSeen) return false;
if (canBreak(queue, s, start, wordSet)) return true;
seen[start] = true;
return false;
}
var canBreak = (queue, s, start, wordSet) => {
for (let end = start + 1; end <= s.length; end++) {
const word = s.slice(start, end);
if (!wordSet.has(word)) continue;
queue.enqueue(end);
const _canBreak = end === s.length;
if (_canBreak) return true;
}
return false
}