题目
空间复杂度: n*2^n
时间复杂度:至少n *2^n.
如下:f(n)=f(n-1)+sigma(dp[i].size())(1<=i<=n);
class Solution {
public:
map<string,vector<string>>dp;
set<string>se;
void dfs(string s){
if(dp.count(s)) return;
vector<string>tmp;
if(se.count(s)) tmp.push_back(s);
int n=s.size();
for(int i=0;i<n-1;++i){//[0,i],[i+1,n-1]
string tmpstr=s.substr(0,i+1);
if(!se.count(tmpstr)) continue;
string ss=s.substr(i+1,n-i-1);
dfs(ss);
for(int sz=0;sz<dp[ss].size();++sz) tmp.push_back(tmpstr+" "+dp[ss][sz]);
}
dp[s]=tmp;
}
vector<string> wordBreak(string s, vector<string>& wordDict) {
for(int i=0;i<wordDict.size();++i) se.insert(wordDict[i]);
dfs(s);
return dp[s];
}
};
class Solution {
public:
unordered_map<int,vector<string> >dp;
void dfs(string s, vector<string>& words,int dex){
if(dp.count(dex)) return;
if(dex==s.size()){
dp[dex]={""};return;
}
dp[dex]={};
for(int i=0;i<words.size();++i){
int len=words[i].size();
if(dex+len-1>=s.size()) continue;
if(s.substr(dex,len)==words[i]){
dfs(s,words,dex+len);
for(const string& str:dp[dex+len]){
if(str!="") dp[dex].push_back(words[i]+" "+str);
else dp[dex].push_back(words[i]+str);
}
}
}
}
vector<string> wordBreak(string s, vector<string>& words) {
dfs(s,words,0);
return dp[0];
}
};
//无语 用vector就tl,map就可以。。。
class Solution {
#define N 1000
public:
unordered_map<int,vector<string> >dp;
//vector<string>dp[N];
unordered_set<string>se;
void dfs(string&s,int dex){//算[dex,s.size()-1]有多少种答案
//if(!dp[dex].empty()) return;
if(dp.count(dex)) return;
if(dex==s.size()){dp[dex]={""};return;}
dp[dex]={};
for(int i=dex+1;i<=s.size();++i){//枚举 下一个dfs的dex
string word=s.substr(dex,i-dex);
if(!se.count(word)) continue;
dfs(s,i);
for(const string& str:dp[i]) dp[dex].push_back(str.empty()?word:word+" "+str);
}
}
vector<string> wordBreak(string s, vector<string>& words) {
se=unordered_set(words.begin(),words.end());
dfs(s,0);
return dp[0];
}
};