给定一个非空字符串 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的更多相关文章

  1. Java实现 LeetCode 140 单词拆分 II(二)

    140. 单词拆分 II 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分 ...

  2. [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 ...

  3. [LeetCode] 140. 单词拆分 II

    题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...

  4. 140. 单词拆分 II

    Q: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分隔时可以重复使用字典 ...

  5. [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 ...

  6. Java实现 LeetCode 140 单词拆分II

    class Solution { public List<String> wordBreak(String s, List<String> wordDict) { List&l ...

  7. [LeetCode] 139. Word Break 单词拆分

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  8. 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】

    [139-Word Break(单词拆分)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s and a dictionary of w ...

  9. leetcode 140 单词拆分2 word break II

    单词拆分2,递归+dp, 需要使用递归,同时使用记忆化搜索保存下来结果,c++代码如下 class Solution { public: //定义一个子串和子串拆分(如果有的话)的映射 unorder ...

随机推荐

  1. Git-commit与回滚

    # 提交-信息 git commit -m "message" git commit -a -m "message" // 等同于 git add . & ...

  2. netcore一键部署到linux服务器以服务方式后台运行

    @font-face { font-family: octicons-link; src: url("data:font/woff;charset=utf-8;base64,d09GRgAB ...

  3. SSTI Flask

    1.什么是SSTI?什么是Flask? ​ SSTI称为服务端模板注入,主要为Python.Java.PHP的框架在使用渲染函数时,由于代码不规范或者对于用户输入过于信任而导致产生了SSTI.类似于S ...

  4. CTF练习(1)这是一张单纯的图片?

    1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个  CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便   ...

  5. SQL注入学习-Dnslog盲注

    1.基础知识 1.DNS DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 ...

  6. 深入浅出!springboot从入门到精通,实战开发全套教程!

    前言 之前一直有粉丝想让我出一套springboot实战开发的教程,我这边总结了很久资料和经验,在最近总算把这套教程的大纲和内容初步总结完毕了,这份教程从springboot的入门到精通全部涵盖在内, ...

  7. mac中怎么完成移动硬盘分区这个操作

    移动硬盘在出厂时只有一个区,不方便我们存储和查阅文件,移动硬盘分区可以防止硬盘发生错误,以免造成资料丢失,也可以防止产生无用文件. 移动硬盘基本上都是用Windows系统进行分区的,但是现在很多人使用 ...

  8. Python基础整理,懒得分类了,大家对付看看吧

    第一次搞这么多图

  9. HarmonyOS Java UI之DependentLayout布局示例

    DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...

  10. P2887 [USACO07NOV]Sunscreen G

    将奶牛按照能忍受的阳光强度最大值从小到大排序.对于当前这头奶牛,选取它能抹的最小防晒霜.因为越大的防晒霜后面的奶牛越可能利用,并且抹显然不劣于不抹. 时间复杂度 \(O\left(C\log C+L\ ...