140. Word Break II
Description
Given a string s
and a dictionary of strings wordDict
, add spaces in s
to construct a sentence where each word is a valid dictionary word. Return all such possible sentences in any order.
Note that the same word in the dictionary may be reused multiple times in the segmentation.
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: []
Constraints:
1 <= s.length <= 20
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 10
s
andwordDict[i]
consist of only lowercase English letters.- All the strings of
wordDict
are unique. - Input is generated in a way that the length of the answer doesn't exceed 105.
Solutions
Solution: Backtracking
- Time complexity: O(2n)
- Space complexity: O(2n)
JavaScript
js
/**
* @param {string} s
* @param {string[]} wordDict
* @return {string[]}
*/
const wordBreak = function (s, wordDict) {
const n = s.length;
const wordDictSet = new Set(wordDict);
const subStrMap = new Map();
const result = [];
const breakWord = (start, current) => {
if (start === n) {
result.push(current.trimEnd());
return;
}
for (let index = start; index < n; index++) {
const key = `${start},${index + 1}`;
const memoSubStr = subStrMap.get(key);
const subStr = memoSubStr ?? s.slice(start, index + 1);
if (!memoSubStr) subStrMap.set(key, subStr);
if (!wordDictSet.has(subStr)) continue;
breakWord(index + 1, `${current}${subStr} `);
}
};
breakWord(0, '');
return result;
};