Given a string s and a dictionary of words dict, add spaces ins 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"]
.
-
1. DP 获得s的每个位置对应的可能的分割(ppos)
2. DFS遍历ppos,在末节点把当前路径(分割)存入ret
--------------------------
class Solution {
public:
vector<string> wordBreak(string s, unordered_set<string> &dict) {
int len = s.length();
vector<string> ret;
vector<list<int>> ppos(len + 1, list<int>());
ppos[0].push_back(-1);
for (int i = 1; i <= len; i++) {
for (int j = i; j > 0; j--) {
if (ppos[j - 1].size() > 0 && dict.count(s.substr(j - 1, i - j + 1)) > 0) {
ppos[i].push_back(j - 1);
}
}
}
buildWordBreakResults(ret, ppos, s, "", len);
return ret;
}
private:
void buildWordBreakResults(vector<string> &ret, vector<list<int>> &ppos, string &s, string curs, int cpos) {
if (cpos == 0) {
ret.push_back(curs);
return;
}
for (auto it = ppos[cpos].begin(); it != ppos[cpos].end(); it++) {
int pindex = *it;
string ts = s.substr(pindex, cpos - pindex);
buildWordBreakResults(ret, ppos, s, (curs.length() == 0 ? ts : ts + " " + curs), pindex);
}
}
};