algorithm - 如何找到在单个字典单词中剪切句子的方法总数
问题描述
我面临着优化一个问题的解决方案,它是word break II的一个变体。
但是在这个问题中,我必须找到句子的总数而不打印它们。所以不想存储它们。
我写了一个蛮力解决方案,我将所有有效的句子保存在一个容器中,然后最终返回它的总大小。
这是我写的代码
unordered_set<string> getWays(string str, unordered_set<string> &wordDict) {
unordered_set<string> ans;
if(str.empty()) {
return ans;
}
if(wordDict.find(str) != wordDict.end()) {
ans.insert(str);
}
for(int i = 1; i <= str.size(); i++) {
string pre = str.substr(0, i);
string suf = str.substr(i);
if(wordDict.find(pre) != wordDict.end()) {
unordered_set<string> ans_for_suf = getWays(suf, wordDict);
for(string s : ans_for_suf) {
ans.insert(pre + "|" + s);
}
}
}
return ans;
}
and I am using ans.size() as the answer.
在这里我可以使用动态编程来进一步优化它,但这不是一个好方法。
所以我的目标是假设输入是
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
然后没有返回
[
"cats and dog",
"cat sand dog"
]
我想返回2,也就是上面返回数组的大小。
请给我一些想法。
解决方案
这是使用Trie和DFS的解决方案:
- 使用字典中的所有单词构建一个 trie。
- 从给定的字符串开始一个 dfs 。每个字符都是一个节点。
- 遍历给定的字符串,并检查您当前是否处于任何字典单词结束的位置。
- 如果有一个字典词以这里结尾,则从那里开始 dfs 。
这个简单的递归解决方案会起作用,但不会及时。使用dp 记忆,它应该是有效的。
推荐阅读
- .htaccess - Htaccess 导致子域 '404 not found' 错误
- ios - 如何在 swift 中将 JSON `null` 值传递给`nil` 值?
- git - 当我只提交小的更改时,为什么 git 会压缩和写入所有项目文件?
- android - 如何将位图转换为 RoundRect 位图?
- asp.net-mvc - 如何将未经授权的用户重定向到登录页面
- c++ - 如何在 netpbm 图像中绘制平滑像素?
- html - 上传 WordPress 静态 HTML 站点后在 GitHub 上显示 404 错误
- swift - 我如何禁用在 ipad 中的 iphone 中工作的按钮,因为 ipad 具有这些功能
- python - 如何从上面的目录导入包/模块
- php - 如何从网页 url 读取数据并仅将一部分(唯一)回显到页面?