Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.
Return all such possible sentences.
For example, given
s = "catsanddog"
,
dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
创建一张二维表记录 s(i,j) 是否是dict里的一个元素。后面大家就知道了。参考:http://blog.youkuaiyun.com/lanxu_yy/article/details/17310247
class Solution {
public:
vector<vector<bool>> dptable;
vector<string> results;
vector<string> records;
vector<string> wordBreak(string s, unordered_set<string> &dict) {
dptable = vector<vector<bool>>(s.length(),vector<bool>());
for(int ii = 0; ii < s.length(); ii ++) {
for(int jj = ii; jj < s.length(); jj ++) {
dptable[ii].push_back(isMatch(s.substr(ii, jj - ii + 1), dict));
}
}
findresults(s.length() - 1, s);
return results;
}
void findresults(int ii, string s) {
if(ii == -1) {
string str;
for(int jj = records.size() - 1; jj >= 0; jj --) {
str += records[jj];
if(jj != 0) {
str.push_back(' ');
}
}
results.push_back(str);
}
else {
for(int kk = 0; kk <= ii; kk ++) {
if(dptable[kk][ii - kk]) {
records.push_back(s.substr(kk, ii - kk + 1));
findresults(kk - 1, s);
records.pop_back();
}
}
}
}
bool isMatch(string str, unordered_set<string> &dict) {
unordered_set<string>::const_iterator got = dict.find(str);
if(got != dict.end()) {
return true;
}
else {
return false;
}
}
};