leetcode之回溯backtracing专题4
131 Palindrome Partitioning
输入一个字符串s,将s分割为n个子串,每个子串都是一个回文。返回s有多少种分割方式。
例如输入:“aab”
输出:[
[“aa”,”b”],
[“a”,”a”,”b”]
]
思路:这是一个不断将问题规模变小的问题。有点动态规划的味道。
问题1 对”aab”切分子串。首先可以看做是 “a” 和”ab”切分。第一部分”a”切分确定,并且”a”是一个回文,”ab”作为输入字符串再次回到原问题。
问题1-1 对”ab”切分子串。不断递归直到输入字符串为0。
再次回到问题1。第二可以看做是 “aa” 和”b”切分。第一部分”aa”切分确定,并且”aa”是一个回文,”b”作为输入字符串再次回到原问题。
问题1-2 对”b”切分子串。
…..不断下去。
partition(“abc”) =[ “a” + partition(“bc”)] + [ “aa” + partition(“c”)] + [ “aab” + partition(“”)]
partition(“bc”)=[“b”+partition(“c”)]
partition(“c”)=”c”
partition(“”) 添加答案,直接退出。
private List<List<String>> resultList = new ArrayList<List<String>>();public List<List<String>> partition(String s) {resultList.clear();doPartition(s,new ArrayList<String>());return resultList;}private void doPartition(String s,List<String> result){if(s==""){List<String> n = new ArrayList<String>();n.addAll(result);resultList.add(n);return;}int startIdx = 0;for(int endIdx = 1;endIdx<s.length();endIdx++){String subString = s.substring(startIdx,endIdx);if(isPalindrome(subString)){result.add(subString);doPartition(s.substring(endIdx),result);result.remove(result.size()-1);}}if(isPalindrome(s)){result.add(s);doPartition("",result);result.remove(result.size()-1);}}private boolean isPalindrome(String s){int mid = s.length()/2;int end = s.length()-1;for(int i=0;i<mid;i++){if(s.charAt(i)!=s.charAt(end-i)){return false;}}return true;}
改进
思路一模一样,只是在处理的时候尽量少使用String的substring方法。参考链接。substring会创建一个新的String对象,同时有一个数组拷贝的动作。该版本的速度大大提升。
private List<List<String>> resultList = new ArrayList<List<String>>();public List<List<String>> partition(String s) {resultList.clear();doPartition(s,0,new ArrayList<String>());return resultList;}private void doPartition(String s,int leftIdx,List<String> result){if(leftIdx==s.length()){List<String> n = new ArrayList<String>();n.addAll(result);resultList.add(n);return;}for(int endIdx = leftIdx;endIdx<s.length();endIdx++){if(isPalindrome(s,leftIdx,endIdx)){result.add(s.substring(leftIdx,endIdx+1));doPartition(s,endIdx+1,result);result.remove(result.size()-1);}}}private boolean isPalindrome(String s,int l,int r){if(l==r) return true;while(l<r){if(s.charAt(l)!=s.charAt(r)){return false;}l++;r--;}return true;}
leetcode之回溯backtracing专题4相关推荐
- leetcode之回溯backtracing专题5
参考链接 http://blog.csdn.net/zhongkeli/article/details/6966805 https://leetcode.com/problems/permutatio ...
- leetcode之回溯backtracing专题2
46 Permutations 输入一个不重复的数组 ,写出这个数组的排列,不能重复. 例如 输入nums=[1,2,3],输出 [ [1,2,3], [1,3,2], [2,1,3], [2,3,1 ...
- leetcode之回溯backtracing专题3
17 Letter Combinations of a Phone Number 手机上每个数字按钮旁边都有3-4个字母,输入数字字符串,输出可能的字母组合. 例如输入:"23" ...
- leetcode之回溯backtracing专题1
39 Combination Sum 给一组整数,给一个目标整数.从数组中任意选择几个数,这几个数的和等于目标整数.数组中每个数字可以选择多次. 例如given candidate set [2, 3 ...
- LeetCode Hot100 ---- 回溯算法专题
回溯算法是什么?解决回溯算法相关的问题有什么技巧?如何学习回溯算法?回溯算法代码是否有规律可循? 其实回溯算法其实就是我们常说的 DFS 算法,本质上就是一种暴力穷举算法. 解决一个回溯问题,实际上就 ...
- Leetcode总结(Island专题)
Leetcode总结之 Island专题 Table of Contents 总结 200. Number of Islands 305. Number of Islands II 695. Max ...
- leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!
" 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...
- 【LeetCode】回溯 N皇后(DFS、子集、组合问题)
总结 技巧: 子集和组合问题经常需要一个start来标记开始选择的起始位置来达到去重的目的,排列问题不用 [46.全排列] 排列问题常需要一个used数组来标记已经选择的元素(也可以同时用于去重) C ...
- leetcode two sum python_LeetCode专题-Python实现之第1题:Two Sum
相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小 ...
最新文章
- Android QQ登录 程序奔溃的问题
- Oracle中修改遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”
- python 识别 None,NaN,null,‘‘,‘ ‘ 等无意义的值
- 用python把excel中的数据变成字典(复制代码即可用)
- 关于nginx rtmp的一点配置
- java 日期 yyyy_java日期中YYYY与yyyy的区别
- html input type=quot;filequot;,input[type='file']默认样式
- struts转换器详解
- 新升级带特效喝酒神器小程序源码-多种游戏支持流量主
- Termux字体大小调整
- 计量经济学计算机答案第三章课后答案,庞皓计量经济学第2版课后习题答案
- 计算机图像双曲线的代码,双曲线
- 做到这一点,帮你每年多赚10万!
- LAN9252/3 EtherCAT module
- 浙江新青年计算机学校,新青年
- 科技视界杂志科技视界杂志社科技视界编辑部2022年第18期目录
- 美国国土安全部重点努力加强国家关键基础设施的网络安全
- LINUX基础CAN指令及常见操作
- IDEA设置护眼背景及字体大小
- Vue3 优雅的模态框封装方案