题链:https://leetcode-cn.com/problems/word-break-ii/
思路:记忆化搜索,ans[i],表示以第i个字母开始能组成的句子的集合。每次一个个的试一个单词即可。
class Solution {
public:
int n;
unordered_map<int,vector<string> > ans;
//unordered_map<string,bool> mp;
unordered_set<string> book;
void dfs(string s,int pos){
if(!ans.count(pos)){
//cout<<"pos:"<<pos<<endl;
if(pos==n){
ans[pos]={""};
return ;
}
ans[pos]={};
for(int i=pos+1;i<=n;i++){
string temp=s.substr(pos,i-pos);
if(book.count(temp)){
dfs(s,i);
for(int j=0;j<ans[i].size();j++){
string ttemp=ans[i][j];
ans[pos].push_back(ttemp==""?temp:temp+" "+ttemp);
}
}
}
}
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
// for(int i=0;i<wordDict.size();i++)
// mp[wordDict[i]]=1;
book = unordered_set(wordDict.begin(), wordDict.end());
n=s.size();
dfs(s,0);
return ans[0];
}
};