WordBreakII_140
来源:互联网 发布:mac开发工具 编辑:程序博客网 时间:2024/06/17 05:29
leetcode链接:https://leetcode.com/problems/word-break-ii/description/
这道题目和之前的WordBreak类似,但是难度大了不少,因为要穷举出所有可能的组合情况,而不是简单的判断,这样,再采用之前解决WordBreak的动态规划,自底向上推导出结果的办法,不太可能,这里我采用对字符串进行暴力破解,自顶向下,循环递归,试图优化解决的。
思路:
字符串s要被字典组合表示,那么s的首字母所在子串必定出现在字典中,就从这里开始遍历。
如图所示字符串s长度为 N。从a出发,把这N中情况全部递归执行一次,假设在a–>c这条路上,也就是说“abc”出现在了字典中,那么就进入下一轮递归,此时c就相当于取代了之前a的位置,这样不断循环遍历下去。
代码:
/* * leetcode链接:https://leetcode.com/problems/word-break-ii/description/ */package leetcode;import java.util.ArrayList;import java.util.HashSet;import java.util.Set;public class WordBreakII_140 { public static void main(String[] args) { String s = "catsanddog"; //测试用例字符串 Set<String> dict = new HashSet<String>(); //测试用例字典 dict.add("cat"); dict.add("cats"); dict.add("and"); dict.add("sand"); dict.add("dog"); ArrayList<ArrayList<String>> res = wordBreakII(s, dict); System.out.println(res.toString()); } private static ArrayList<ArrayList<String>> wordBreakII(String s, Set<String> dict) { ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>(); //保存最终结果 ArrayList<String> single = new ArrayList<String>(); //保存中间结果 if(s.length() == 0) return null; wordBreakII(s, 0, dict, single, res); return res; } private static void wordBreakII(String s, int begin, Set<String> dict, ArrayList<String> single, ArrayList<ArrayList<String>> res) { //循环迭代的结束条件 if(begin == s.length()) { ArrayList<String> single_temp = new ArrayList<String>(); //实现深复制,把数据进行保存 for(int i = 0; i < single.size(); i++) { single_temp.add(single.get(i)); } res.add(single_temp); //single.remove(single.get(single.size() - 1)); //删除single的最后一个元素 return; } for(int i = begin; i < s.length(); i++) { String temp = s.substring(begin, i + 1); if(dict.contains(temp)) { //当前子串存在于字典中 single.add(temp); //将存在于字典中的子串进行保存 wordBreakII(s, i + 1, dict, single, res); single.remove(single.size() - 1); //数据已保存,将存入的字符串删除 } } }}
这个代码是十分简洁的,主函数提供了测试用例,并用一个ArrayList来接收最终的结果,每一个元素都按顺序存储着一种组合情况。wordBreakII()是两个重载函数,这样设计是为了松耦合,同时递归模块也更清晰。wordBreakII(String s, Set dict)接收参数,调用递归模块。变量res存储最终结果,single存储中间递归结果。
注意single_temp那一块,由于引用的原因,必须创建新的对象,并将single的数据深复制过去,这样才能把数据独立存储到res中。
这个实现显然是指数级别的,典型的循环 * 递归的模式。欢迎更好的解法!!!
阅读全文
0 0
- WordBreakII_140
- servo 0.12.17 学习笔记
- 对自己大三的一些计划和安排
- CCF-201412-1-门禁系统
- leetcode 73. Set Matrix Zeroes
- 数据分析与软件
- WordBreakII_140
- 深入理解ES6箭头函数的this
- Leetcode315——Count of Smaller Numbers After Self
- mysql数据类型和常用字段
- HDU 6201 transaction transaction transaction(树形dp)
- 关于APP在小米5s第一次安装启动后,点击home返回桌面,再次进入重进闪屏页问题
- 浅析对象关系映射
- JSTL中foreach的使用与总结
- rails 常用命令