算法——单词拆分 II
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
链接: leetcode.
解题思路:
- 首先用暴力的深度优先搜索,然后发现对部分测试用例会超时,所以需要对搜索进行剪枝。一般的剪枝手段都是记忆化一种状态的结果,然后当下次搜索到这一状态时防止重复计算,这样基本能将时间复杂度降到O(N)。
- 深度优先搜索基本使用这一模板,传入一个temp结果,每次递归到底部之前,给temp增加值,然后记得需要回溯,也就是去除当前状态下增加的值。
- 这里的剪枝我是这么考虑的,如果当前位置往后递归后无法增加结果,说明这个位置之后的字符串不能被拆分,所以,其他分支搜索到当前位置时,就没必要往下计算,通过一个hash表,记录下这个位置的状态,然后后来的分支检测到这个位置的状态,直接返回。
// created by lippon
class Solution {
List<String> res = new ArrayList<>();
Map<String, Boolean> wd = new HashMap<>();
Map<Integer, Boolean> men = new HashMap<>();
public List<String> wordBreak(String s, List<String> wordDict) {
for(String w : wordDict) wd.put(w, true);
dfs(0, new StringBuilder(), s);
return res;
}
public void dfs(int cur, StringBuilder temp, String s) {
// 搜索到了底部
if(cur == s.length()) {
if(temp.length() > 0) {
// 添加结果
temp.deleteCharAt(temp.length() - 1);
res.add(temp.toString());
}
return ;
}
// 剪枝,查看当前位置后的字符串时候不能被拆分,如果不能,直接返回
if(men.getOrDefault(cur, false)) return;
// 记录这次dfs时的结果数
int len = res.size();
for(int i = cur + 1; i <= s.length(); i++) {
String word = s.substring(cur, i);
if(wd.containsKey(word)) {
StringBuilder nt = new StringBuilder(temp);
temp.append(word);
temp.append(" ");
dfs(i, temp, s);
// 回溯
temp = nt;
}
}
// 如果结果没有增加,说明该位置不能产生答案,进行记忆
if(len == res.size()) men.put(cur, true);
}
}
算法——单词拆分 II的更多相关文章
- Java实现 LeetCode 140 单词拆分 II(二)
140. 单词拆分 II 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分 ...
- [LeetCode] 140. Word Break II 单词拆分II
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...
- [LeetCode] 140. 单词拆分 II
题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...
- 140. 单词拆分 II
Q: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分隔时可以重复使用字典 ...
- [Swift]LeetCode140. 单词拆分 II | Word Break II
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...
- Java实现 LeetCode 140 单词拆分II
class Solution { public List<String> wordBreak(String s, List<String> wordDict) { List&l ...
- [LeetCode] 139. Word Break 单词拆分
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...
- 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】
[139-Word Break(单词拆分)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s and a dictionary of w ...
- leetcode 140 单词拆分2 word break II
单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...
随机推荐
- Git-commit与回滚
# 提交-信息 git commit -m "message" git commit -a -m "message" // 等同于 git add . & ...
- netcore一键部署到linux服务器以服务方式后台运行
@font-face { font-family: octicons-link; src: url("data:font/woff;charset=utf-8;base64,d09GRgAB ...
- SSTI Flask
1.什么是SSTI?什么是Flask? SSTI称为服务端模板注入,主要为Python.Java.PHP的框架在使用渲染函数时,由于代码不规范或者对于用户输入过于信任而导致产生了SSTI.类似于S ...
- CTF练习(1)这是一张单纯的图片?
1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个 CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便 ...
- SQL注入学习-Dnslog盲注
1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...
- 深入浅出!springboot从入门到精通,实战开发全套教程!
前言 之前一直有粉丝想让我出一套springboot实战开发的教程,我这边总结了很久资料和经验,在最近总算把这套教程的大纲和内容初步总结完毕了,这份教程从springboot的入门到精通全部涵盖在内, ...
- mac中怎么完成移动硬盘分区这个操作
移动硬盘在出厂时只有一个区,不方便我们存储和查阅文件,移动硬盘分区可以防止硬盘发生错误,以免造成资料丢失,也可以防止产生无用文件. 移动硬盘基本上都是用Windows系统进行分区的,但是现在很多人使用 ...
- Python基础整理,懒得分类了,大家对付看看吧
第一次搞这么多图
- HarmonyOS Java UI之DependentLayout布局示例
DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...
- P2887 [USACO07NOV]Sunscreen G
将奶牛按照能忍受的阳光强度最大值从小到大排序.对于当前这头奶牛,选取它能抹的最小防晒霜.因为越大的防晒霜后面的奶牛越可能利用,并且抹显然不劣于不抹. 时间复杂度 \(O\left(C\log C+L\ ...