把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
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
size();i++){ - int j=get(s[i]);
- p=ch[p][j];
- if(!p) break;
- }
- return p&&vis[p];
- }
- vector
dfs(string s) { - vector
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
wordBreak(string s, vector& wordDict) { - for(auto ss:wordDict) insert(ss);
- return dfs(s);
- }
- };
复杂度为指数级别。