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);
}
}
};

本文介绍了一种使用动态规划和深度优先搜索的方法来解决字符串拆分与组合问题,通过构建前缀字典树(ppos)并进行DFS遍历,实现对给定字符串的所有合法拆分方式的生成。
5185

被折叠的 条评论
为什么被折叠?



