class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<string> res;
int len=s.size();
bool **seg = new bool*[len];
for (int i=0; i<len; i++) {
seg[i]=new bool[len-i];
}
for (int n=1; n<=len; n++) {
for (int i=0; i<=len-n; i++) {
seg[i][n-1]=false;
if (dict.find(s.substr(i,n))!=dict.end()) {
seg[i][n-1]=true;
continue;
}
for (int j=1; j<n; j++) {
if (seg[i][j-1]&&seg[i+j][n-1-j]) {
seg[i][n-1]=true;
break;
}
}
}
}
if (!seg[0][len-1]) return res;
vector<string> buffer;
dfs(s,dict,seg,0,len,res,buffer);
return res;
}
void dfs (string s, unordered_set<string> &dict, bool **seg, int start, int length, vector<string> &res, vector<string> &buffer) {
if (start==length) {
string word;
int i;
word.append(buffer[0]);
for(i=1; i<buffer.size(); i++) {
word.append(" ");
word.append(buffer[i]);
}
res.push_back(word);
return;
}
for (int n=1; n<=length; n++) {
if (seg[start][n-1]) {
string sub=s.substr(start, n);
if (dict.find(sub)==dict.end()) {
continue;
}
buffer.push_back(sub);
dfs(s,dict,seg,start+n,length,res,buffer);
buffer.pop_back();
}
}
}
};
08-04
08-04
08-04
08-04
08-04
08-04