回溯法 + 记忆化
代码:
class Solution140_hard {
public:
vector<string> wordBreak(string s, vector<string>& wordDict) {
if (s.empty())
return {};
unordered_set<string> wordSet;
unordered_map<int, vector<string>> memorys;
for (int i = 0; i < wordDict.size(); i++) {
wordSet.insert(wordDict[i]);
}
return recursion(s, 0, wordSet, memorys);
}
private:
vector<string> recursion(const string &s, int index, unordered_set<string>& wordDict, unordered_map<int, vector<string>> &memorys) {
if (index == s.size())
return {""};
unordered_map<int, vector<string>>::iterator it = memorys.find(index);
if (it != memorys.end()) {
return it->second;
}
vector<string> strlist;
for (int i = index + 1; i <= s.length(); i++) {
if (wordDict.find(s.substr(index, i - index)) != wordDict.end()) {
vector<string> tmpstr = recursion(s, i, wordDict, memorys);
memorys[i] = tmpstr;
for (int j = 0; j < tmpstr.size(); j++)
if (tmpstr[j].size())
strlist.push_back(s.substr(index, i - index) + " " + tmpstr[j]);
else
strlist.push_back(s.substr(index, i - index));
}
}
return strlist;
}
};