题目:
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:
void helper(string s, vector<string>& wordList, vector<string>& res, int start, string &last) {
if (start >= s.length()) {
res.push_back(last);
return;
}
for (int i = start; i < s.length(); i++) {
string temp = s.substr(start, i - start + 1);
if (std::count(wordList.begin(), wordList.end(), temp) > 0) {
string t = "";
if (last == "")t = temp;
else t= last+" " + temp;
helper(s, wordList, res, i + 1, t);
}
}
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
vector<string> res;
string last="";
helper(s, wordDict, res, 0, last);
return res;
}
};
方法二——:
class Solution {
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
unordered_map<string, vector<string>> m;
return helper(s, wordDict, m);
}
vector<string> helper(string s, vector<string>& wordDict, unordered_map<string, vector<string>>& m) {
if (m.count(s)) return m[s];
if (s.empty()) return {""};
vector<string> res;
for (string word : wordDict) {
if (s.substr(0, word.size()) != word) continue;
vector<string> rem = helper(s.substr(word.size()), wordDict, m);
for (string str : rem) {
res.push_back(word + (str.empty() ? "" : " ") + str);
}
}
return m[s] = res;
}
};