题目:
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string>& wordDict) {
vector<string> res;
if (s.empty() || wordDict.empty()) return res;
int n = s.size();
//table[i]表示从s[i]能否跳到下一个break位置,如果能,则保存能跳到哪些位置
vector<vector<int> > table(n);
for (int i = n - 1; i >= 0; --i){
string oneWord = s.substr(i);
if (wordDict.count(oneWord) != 0){
table[i].push_back(n);
}
}
for (int i = n - 1; i >= 0; --i){
if (!table[i].empty()){//从i到n-1可以break
//现在看看从i前面的各个位置能否跳到i
for (int j = i - 1, d = 1; j >= 0; --j, ++d){
string oneWord = s.substr(j, d);
if (wordDict.count(oneWord) != 0){//j可以跳到i
table[j].push_back(i);
}
}
}
}
//递归求sentence
string oneSentence;
wordBreakCore(s, 0, table, oneSentence, res);
return res;
}
private:
void wordBreakCore(const string &s, int start, const vector<vector<int> > &table, string oneSentence, vector<string> &res){
if (start == s.size()){
oneSentence.pop_back();//去掉结尾的' '
res.push_back(oneSentence);
return;
}
for (int i = 0; i < table[start].size(); ++i){//回溯
string tmp = oneSentence + s.substr(start, table[start][i] - start) + " ";
wordBreakCore(s, table[start][i], table, tmp, res);
}
}
};