Problem
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.
Examples
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: []
Solution
We have already seen part 1 of the problem - Word Break 1 - Check if word is breakable. Instead of using a boolean array to track the matched positions, we need to track the actual matched words.
Method 1 - Backtracking
We have seen Word Break 1 - Check if word is breakable#Method 1 - Brute force - Generate all substrings. We will use solution similar to Subsets Problem.
Here is the video explanation:
Code
Java
public class Solution {
public List<String> wordBreak(String s, List<String> wordDict) {
List<String> ans = new ArrayList<>();
dfs(s, new HashSet<String>(wordDict), 0, ans, new ArrayList<>());
return ans;
}
private void dfs(String s, Set<String> set, int idx, List<String> ans, List<String> subAns) {
if (idx == s.length()) {
if (subAns.size() > 0) {
ans.add(String.join(" ", subAns));
}
return;
}
for(int i = idx + 1; i <= s.length(); i++) {
String sub = s.substring(idx,i);
if(set.contains(sub)) {
subAns.add(sub);
dfs(s, set, i, ans, subAns);
subAns.remove(subAns.size() - 1);
}
}
}
}
Complexity
- ⏰ Time complexity:
O(2^n)
- 🧺 Space complexity:
O(n + m)
- where n is the length of string s, and m is number of words in dict
Method 2 - Dynamic Programming
#TODO use DP solution used in Word Break 1 - Check if word is breakable.
Method 3 - Using Trie
#TODO work on this solution later