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相关推荐

  1. leetcode之回溯backtracing专题5

    参考链接 http://blog.csdn.net/zhongkeli/article/details/6966805 https://leetcode.com/problems/permutatio ...

  2. leetcode之回溯backtracing专题2

    46 Permutations 输入一个不重复的数组 ,写出这个数组的排列,不能重复. 例如 输入nums=[1,2,3],输出 [ [1,2,3], [1,3,2], [2,1,3], [2,3,1 ...

  3. leetcode之回溯backtracing专题3

    17 Letter Combinations of a Phone Number 手机上每个数字按钮旁边都有3-4个字母,输入数字字符串,输出可能的字母组合. 例如输入:"23" ...

  4. leetcode之回溯backtracing专题1

    39 Combination Sum 给一组整数,给一个目标整数.从数组中任意选择几个数,这几个数的和等于目标整数.数组中每个数字可以选择多次. 例如given candidate set [2, 3 ...

  5. LeetCode Hot100 ---- 回溯算法专题

    回溯算法是什么?解决回溯算法相关的问题有什么技巧?如何学习回溯算法?回溯算法代码是否有规律可循? 其实回溯算法其实就是我们常说的 DFS 算法,本质上就是一种暴力穷举算法. 解决一个回溯问题,实际上就 ...

  6. Leetcode总结(Island专题)

    Leetcode总结之 Island专题 Table of Contents 总结 200. Number of Islands 305. Number of Islands II 695. Max ...

  7. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!

    " 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...

  8. 【LeetCode】回溯 N皇后(DFS、子集、组合问题)

    总结 技巧: 子集和组合问题经常需要一个start来标记开始选择的起始位置来达到去重的目的,排列问题不用 [46.全排列] 排列问题常需要一个used数组来标记已经选择的元素(也可以同时用于去重) C ...

  9. leetcode two sum python_LeetCode专题-Python实现之第1题:Two Sum

    相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始几行代码内容,有一些不规范的地方,比如函数名大小 ...

最新文章

  1. Android QQ登录 程序奔溃的问题
  2. Oracle中修改遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”
  3. python 识别 None,NaN,null,‘‘,‘ ‘ 等无意义的值
  4. 用python把excel中的数据变成字典(复制代码即可用)
  5. 关于nginx rtmp的一点配置
  6. java 日期 yyyy_java日期中YYYY与yyyy的区别
  7. html input type=quot;filequot;,input[type='file']默认样式
  8. struts转换器详解
  9. 新升级带特效喝酒神器小程序源码-多种游戏支持流量主
  10. Termux字体大小调整
  11. 计量经济学计算机答案第三章课后答案,庞皓计量经济学第2版课后习题答案
  12. 计算机图像双曲线的代码,双曲线
  13. 做到这一点,帮你每年多赚10万!
  14. LAN9252/3 EtherCAT module
  15. 浙江新青年计算机学校,新青年
  16. 科技视界杂志科技视界杂志社科技视界编辑部2022年第18期目录
  17. 美国国土安全部重点努力加强国家关键基础设施的网络安全
  18. LINUX基础CAN指令及常见操作
  19. IDEA设置护眼背景及字体大小
  20. Vue3 优雅的模态框封装方案

热门文章

  1. Studio 一些使用
  2. 使用PDFBox解析PDF文件
  3. CodeIgniter框架下载辅助函数的一个小bug
  4. 查看当前提供了哪些引擎
  5. Android学习笔记-判断手机外部存储是否可读写
  6. 一款研发管理软件的对象标签介绍
  7. 百度新闻的索引机制(二):智能聚类
  8. SQL select 语法(转)
  9. 矢量合成和分解的法则_力的合成与分解
  10. linux mate eth0已下线,Linux Mint 18 Cinnamon 版和 MATE 版已经可以下载了