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

说明:

分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:

输入:
s = “catsanddog”
wordDict = [“cat”, “cats”, “and”, “sand”, “dog”]
输出:
[
“cats and dog”,
“cat sand dog”
]

代码

class Solution {Map<Integer,List<List<String>>> listMap=new HashMap<>();public List<String> wordBreak(String s, List<String> wordDict) {Trie trie=new Trie();Set<Integer> set=new HashSet<>();for(String c:wordDict) {set.add(c.length());trie.insert(c);}List<String> ret=new ArrayList<>(); List<List<String>> resss=awordBreak(s,0,trie,set);for(java.util.List<String> list:resss) ret.add(String.join(" ",list));//添加空格return ret;}public List<List<String>> awordBreak(String s, int loc,Trie trie,Set<Integer> set) {if(!listMap.containsKey(loc)){List<List<String>> temp=new LinkedList<List<String>>();if(loc==s.length())temp.add(new ArrayList<>());for(int c:set)//测试字典的所有单词{if(loc+c<=s.length()){String need=s.substring(loc,loc+c);if(trie.search(need)){//该单词合法List<List<String>> nexts=   awordBreak(s,loc+c,trie,set);//递归获取字符串后部分返回的单词序列for(List<String> list:nexts)//将不同的单词序列与当前单词连接{LinkedList<String> next=new LinkedList<>(list);next.offerFirst(need);temp.add(next);}}}}listMap.put(loc,temp);}return listMap.get(loc);}class TrieNode {//字典树private TrieNode[] links;private final int  r=26;private boolean isEnd;public TrieNode() {this.links = new TrieNode[r];}public boolean contains(char c) {return links[c-'a']!=null;}public void put(char c,TrieNode node) {links[c-'a']=node;}public TrieNode get(char c) {return links[c-'a'];}public boolean isEnd() {return isEnd;}public void setEnd() {isEnd = true;}}class  Trie{private TrieNode root;public Trie() {this.root = new TrieNode();}public void insert(String s){TrieNode cur=root;for(int i=0;i<s.length();i++){if(!cur.contains(s.charAt(i))){cur.put(s.charAt(i),new TrieNode());}cur=cur.get(s.charAt(i));}cur.setEnd();}public boolean search(String s){TrieNode cur=root;for(int i=0;i<s.length();i++){if(cur.contains(s.charAt(i))){cur=cur.get(s.charAt(i));}else return false;}return cur.isEnd;}}
}

leetcode 140. 单词拆分 II(记忆化)相关推荐

  1. LeetCode 140. 单词拆分 II(DP+回溯)

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

  2. LeetCode 140. 单词拆分 II

    文章目录 解法1:回溯 + 记忆数组,记录当前字符串 解法2:回溯 + 记忆数组,记录索引 `i` 到字符结尾的字符串能拆分的组合 https://leetcode-cn.com/problems/w ...

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

    class Solution {int n;vector<string>res;unordered_map<int,set<int>>hash;string s;v ...

  4. leetcode 140. Word Break II | 140. 单词拆分 II(动态规划)

    题目 https://leetcode.com/problems/word-break-ii/ 题解 由 leetcode 139. Word Break | 139. 单词拆分(动态规划) 改造而来 ...

  5. 【DFS + 记忆化递归】LeetCode 140. Word Break II

    LeetCode 140. Word Break II Solution1:我的答案 纯DFS,在第31个case时超时,还是记录一下.. class Solution { // DFS public ...

  6. Leetcode 139. 单词拆分

    Leetcode 139. 单词拆分 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/word-break/   本质上 ...

  7. LeetCode 337. 打家劫舍 III(记忆化+递归)

    文章目录 1. 题目 1.1 相关题目: 2. 解题 2.1 递归 2.2 记忆化递归 1. 题目 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称 ...

  8. LeetCode 87. 扰乱字符串(记忆化递归 / DP)

    文章目录 1. 题目 2. 解题 2.1 记忆化递归 2.2 动态规划 1. 题目 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = &q ...

  9. LeetCode 139. 单词拆分(DP)

    1. 题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆分时可以重复使用字典中的单词. 你可以假设字 ...

最新文章

  1. Java之ClassLoader基础知识
  2. 如果你很迷茫,就好好读读这8句话
  3. idea撤销与恢复快捷键_IntelliJ IDEA 重做快捷键和配置哲学
  4. 继承之接口知识点和思考练习
  5. [poco] 访问数据库
  6. 论文浅尝 | MulDE:面向低维知识图嵌入的多教师知识蒸馏
  7. 前端开发要注意的浏览器兼容性问题整理
  8. 存储类、链接、内存管理
  9. 双时隙的工作原理_提高频点利用 海能达双时隙功能效率高
  10. P1830 轰炸III
  11. jmeter html插件,Jmeter最常见的几个插件(一)
  12. CDHtmlDialog探索----WebBrowser扩展和网页Javascript错误处理
  13. java 一年有多少周_用java怎么计算当前年有多少周
  14. 原创 导出微信收藏到电脑
  15. 苹果邮件App漏洞?不要慌
  16. Nginx -- SSL模块
  17. 【TA-霜狼_may-《百人计划》】美术1.4 场景设计精要
  18. 阿里云HaaS100物联网开发板学习笔记(一)硬件资源介绍
  19. 解决Unable to determine application id: com.android.tools.idea.run.ApkProvisionException:
  20. 防范IFEO映像劫持

热门文章

  1. 查找表的原理与结构 什么是竞争与冒险现象?怎样判断?如何消除?
  2. 【汇编语言】结合C语言,使用VS 2017调试模式下的反汇编工具学习32位x86汇编指令
  3. JAVA基础——时间Date类型转换
  4. Asp.net mvc中使用配置Unity
  5. PhotoKit 照片库的管理-获取图像
  6. python学习:re模块
  7. DB天气app冲刺二阶段第七天
  8. SqlHelper模板
  9. 一张有趣的图--《teach yourself c++ in 21 days》
  10. Delphi IDE扩展工具,在IDE中增加Google翻译器