算法——单词拆分 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 ...
随机推荐
- Window常用账号密码修改(Git)
问题 remote: Incorrect username or password ( access token ) 原因 账号已经密码不争取导致的 解决问题 进入控制面板 (控制面板\用户帐户\凭据 ...
- 面试中AOP这样说,面试官只有一个字:服!
- DNS域传输漏洞复现
漏洞原理 DNS分类 常见的DNS记录类型 A IP地址记录,记录一个域名对应的IP地址 AAAA IPv6 地址记录,记录一个域名对应的IPv6地址 CNAME 别名记录,记录一个主机的别名 MX ...
- python-Requests模块的使用
1. Requests简介 Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能,那为什么R ...
- php读取Excel文件数据
首先先下载 PHPExcel 脚本之家下载地址:https://www.jb51.net/codes/194070.html 然后把文件丢到php脚本同级目录里面 在php文件里面写下以下代码即可 & ...
- 阿里云的nginx的https配置问题
server { listen 443 ssl; server_name www.xxx域名.com; root html; index index.html index.html; ssl_cert ...
- DocView 现在支持自定义 Markdown 模版了!
前言 有小伙伴反馈说希望可以自定义 Markdown 模版,这样就可以导出自己想要的样式了!这个功能可以有,毕竟大家不可能都生成一模一样的文档.现在来一起看看如何实现自定义模版吧! 设置模版 Sett ...
- 攻克solo第七课(Randy Rhoads风格)
本期文章,笔者将通过Guitar Pro 7吉他软件跟大家分享一下Randy Rhoads的solo句子. 相信很多精研电吉他的朋友都会听过这个一手把Ozzy Osbourne从离开黑色安息日乐队的深 ...
- WPF有关控件和模板样式设计的微软官方文档
说明 如果你正在使用WPF开发应用程序,相信这篇博客会对你有用.希望你能认真的阅读 正文 此文主要以Button为例进行介绍此文档的组成部分. Button Parts Button控件没有任何命名的 ...
- Linun中配置redis密码
这里以linux服务器为例,为redis配置密码. 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有 ...