把wordDict存到一颗字典树上,然后暴力拆分s串,枚举所有可能的情况,一一查询是否合法。
class Solution {
public:
int ch[10010][26];
int idx;
bool vis[10010];
int get(char c){
return c-'a';
}
void insert(string s){
int p=0;
for(int i=0;i<s.size();i++){
int j=get(s[i]);
if(!ch[p][j]) ch[p][j]=++idx;
p=ch[p][j];
}
vis[p]=1;
}
bool search(string s){
int p=0;
for(int i=0;i<s.size();i++){
int j=get(s[i]);
p=ch[p][j];
if(!p) break;
}
return p&&vis[p];
}
vector<string> dfs(string s){
vector<string> res;
for(int i=1;i<=s.size();i++){
string ss=s.substr(0,i);
if(search(ss)){
if(i==s.size()){
res.push_back(ss);
continue;
}
auto t=dfs(s.substr(i));
for(auto r:t){
res.push_back(ss+" "+r);
}
}
}
return res;
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
for(auto ss:wordDict) insert(ss);
return dfs(s);
}
};
复杂度为指数级别。