-
Notifications
You must be signed in to change notification settings - Fork 156
/
Copy pathword-break-ii.js
93 lines (82 loc) · 1.99 KB
/
word-break-ii.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
* Word Break II
*
* Given a non-empty string s and a dictionary wordDict containing a list of non-empty words,
* add spaces in s to construct a sentence where each word is a valid dictionary word.
* Return all such possible sentences.
*
* Note:
*
* The same word in the dictionary may be reused multiple times in the segmentation.
* You may assume the dictionary does not contain duplicate words.
* Example 1:
*
* Input:
* s = "catsanddog"
* wordDict = ["cat", "cats", "and", "sand", "dog"]
* Output:
* [
* "cats and dog",
* "cat sand dog"
* ]
* Example 2:
*
* Input:
* s = "pineapplepenapple"
* wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
* Output:
* [
* "pine apple pen apple",
* "pineapple pen apple",
* "pine applepen apple"
* ]
* Explanation: Note that you are allowed to reuse a dictionary word.
* Example 3:
*
* Input:
* s = "catsandog"
* wordDict = ["cats", "dog", "sand", "and", "cat"]
* Output:
* []
*/
/**
* @param {string} s
* @param {string[]} wordDict
* @return {string[]}
*/
const wordBreak = (s, wordDict) => {
if (!canBreak(s, wordDict)) {
return [];
}
const result = [];
dfs(s, wordDict, 0, [], result);
return result;
};
const dfs = (s, wordDict, start, solution, result) => {
if (start === s.length) {
result.push(solution.join(' '));
}
for (let end = start + 1; end <= s.length; end++) {
const prefix = s.substring(start, end);
if (wordDict.includes(prefix)) {
solution.push(prefix);
dfs(s, wordDict, end, solution, result);
solution.pop();
}
}
};
const canBreak = (s, wordDict) => {
const table = Array(s.length + 1).fill(false);
table[0] = true; // Empty string can be formed from the dictionary
for (let i = 1; i <= s.length; i++) {
for (let j = 0; j < i; j++) {
const rest = s.substring(j, i);
if (table[j] && wordDict.includes(rest)) {
table[i] = true;
break;
}
}
}
return table[s.length];
};
export { wordBreak };