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: []
考察:dfs;
class Solution {
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
vector<string> res;
string out;
vector<bool> possible(s.size()+1, true);
unordered_set<string> ss(wordDict.begin(), wordDict.end());
wordBreakDFS(s, ss, 0, possible, out, res);
return res;
}
void wordBreakDFS(string &s, unordered_set<string>& ss, int start, vector<bool>& possible,
string &out, vector<string>& res) {
if (start == s.size()) {
res.push_back(out.substr(0, out.size()-1));
return ;
}
for (int i = start; i < s.size(); i ++) {
string word = s.substr(start, i - start + 1);
if (ss.find(word) != ss.end() && possible[i+1]) {
out.append(word).append(" ");
int oldSize = res.size();
wordBreakDFS(s, ss, i + 1, possible, out, res);
if (res.size() == oldSize)
possible[i+1] = false;
out.resize(out.size() - word.size()-1);
}
}
}
};