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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

【问题描述】[简单] 【解答思路】 千万不要想复杂了 不是三维空间 是一维空间 &#xff01; 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是&#xff1a;直接或间接相邻的同色方格构成的整体。 可以发现&#xff0c;「色块」就是被不同颜色的方…

第六章 参数估计(续)

区间估计 问题&#xff1a;点估计估计的参数有多大概率是正确的&#xff1f;用区间估计来表示。 置信区间 设总体X的分布函数F(x;θ)&#xff0c;θ未知&#xff0c;对给定值α(0<α<1)&#xff0c;有两个统计量θ^Lθ^L(X1,X2,...Xn),θ^Uθ^U(X1,X2,...Xn)&#xff0c…

第六十八期:程序员与医生

8月25日 以下文章来源于崖边小生 &#xff0c;作者道友留步 程序员与医生 久病未能成医&#xff0c;然而却悟出了程序员与医生的道理。细想来&#xff0c;程序员和医生这个职业竟如此相似。 职业的诞生 上帝创造了人类&#xff0c;而人类又创造了程序。上帝所创造的人类并…

【数据结构与算法】计数、基数、桶 O(n) 不基于比较

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 桶排序–>分区间桶快速排序&#xff08;归并排序&#xff08;稳定性&#xff09;&#xff09;–>取出结果 计数排序&#xff08;特殊的桶排序&#xff09;–>分单个桶…

java核心-多线程-Java多线程编程涉及到包、类

Java有关多线程编程设计的类主要涉及两个包java.lang和java.util.concurrent两个包 java.lang包&#xff0c;主要是线程基础类 <1>Thread<2>Runnable<3>ThreadLocal java.util包&#xff0c;主要是线程基础类和并发工具类 <1>基础线程类Callable、Futu…

第六十九期:【学习分享】温水里的程序员,技术将成为温水

张泰峰 7月7日 七月&#xff0c;炎炎的夏日&#xff0c;疯狂的暴雨不分昼夜&#xff0c;侵袭着这座城。早上七点&#xff0c;我骑着摩拜单车出发去往地铁站&#xff0c;誓死如归一般的&#xff0c;挤进地铁。像往常一样&#xff0c;骑车、挤地铁、打卡上班。 相信大家都跟我一…

第七章 假设检验

假设检验的目的是通过收集到的数据&#xff0c;来验证某个想要得到的结论。 假设检验的思想是&#xff1a;小概率反证法思想。 显著性检验是本章的主要内容。下面从实际例子来通俗的理解一下显著性检验。 显著性检验中有几个概念不太好理解。 嫌犯X是否有罪 有这样一个事件…

第七十期:IT技术人员的自我修养

8月4日 以下文章来源于空山新雨的技术空间 &#xff0c;作者空山新雨的技术空间 前言 在IT领域摸爬滚打多年&#xff0c;从一个普通程序员到技术主管&#xff0c;到技术经理&#xff0c;再到技术总监&#xff0c;踩过不少坑、加过不少班&#xff0c;也背过不少锅。 在提升自…

NOI2004郁闷的出纳员

传送门 题目看起来玄乎,但其实只需要一点点小 trick 就可以了. 我们可以用一个全局的 delta 来维护工资的调整记录 对于每一个新加入的员工,先判断是否低于最低工资下限,如果是,直接踢出,不做任何操作,否则,将其插入 Treap 中,不过这时为了不对以后的查询产生影响,我们要插入的…

【数据结构与算法】排序优化

冒泡、插入、选择 O(n^2) 基于比较 快排、归并 O(nlogn) 基于比较 计数、基数、桶 O(n) 不基于比较 总结&#xff1a;如何实现一个通用的高性能的排序函数&#xff1f; 一、如何选择合适的排序算法&#xff1f; 1.排序算法一览表 时间复杂度是稳定排序&#xff1f;是原地排…

第七章 假设检验(2)

接上文。 正态总体均值、方差的假设检验 单个正态总体均值的假设检验、方差的假设检验&#xff1b;成对数据均值的假设检验、两个正态总体方差比的检验。根据检验统计量的分布分别称为:z检验、t检验、卡方检验、F检验。 分布原假设H0检验统计量备择假设H1拒绝域单正态(σ2已知…

第二十二期:动画讲解TCP,再不懂请来打我

TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官的青睐。 前言 TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官…

【数据结构与算法】二分查找

一、什么是二分查找&#xff1f; 二分查找针对的是一个有序的数据集合&#xff0c;每次通过跟区间中间的元素对比&#xff0c;将待查找的区间缩小为之前的一半&#xff0c;直到找到要查找的元素&#xff0c;或者区间缩小为0。 二、时间复杂度分析&#xff1f; 1.时间复杂度 …

第七章 假设检验(3)

关于样本量n的取值 如果希望在控制第I类错误的情况下&#xff0c;同时限制第II类错误的&#xff0c;这个时候就需要考虑样本量。样本量越大&#xff0c;错误概率越低。使用OC曲线。 分布拟合检验 如果不知道总体服从什么类型的分布&#xff0c;就需要根据样本来检验分布的假设…

git 多用户多仓库配置

ssh全称是Secure Shell&#xff0c;即安全Shell&#xff0c;是一种可以进行安全远程登录的协议&#xff0c;在Linux中以OpenSSH为代表&#xff0c;Windows中则有Putty作为实现。ssh的会话建立阶段类似TCP协议的三次握手&#xff0c;里面涉及到利用非对称加密(RSA/DSA)和密码协商…

第二十三期:你用的Windows操作系统是不是盗版?微软知道吗

长期以来&#xff0c;一些小白对于微软操作系统的“正版”“盗版”“原版”的含义不太明确&#xff0c;从根本上说Windows原始版权属于微软&#xff0c;我们没有那个技术去开发盗版操作系统&#xff0c;很多人用的可能是二次修改的版本&#xff0c;而操作系统的激活方式&#x…

[Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

【问题描述】[中等] 【解答思路】 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {return buildTree(head, null);}public TreeNode buildTree(ListNode left, ListNode right) {if (left right) {return null;}ListNode mid …

第四十六期:关于云存储的五大优势

5G时代&#xff0c;越来越多的企业开始选择在云上存储数据&#xff0c;对于IT部门来说&#xff0c;了解云存储的优势是很有必要的。今天给大家介绍云存储的五大优势&#xff0c;以及它们如何帮助用户解决一些常见IT问题。 1、可扩展性 传统存储系统以及横向扩展增加的节点&…

leetcode之回溯backtracing专题5

参考链接 http://blog.csdn.net/zhongkeli/article/details/6966805 https://leetcode.com/problems/permutation-sequence/#/description

第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?

Java架构师&#xff0c;首先要是一个高级java攻城狮&#xff0c;熟练使用各种框架&#xff0c;并知道它们实现的原理。jvm虚拟机原理、调优&#xff0c;懂得jvm能让你写出性能更好的代码;池技术&#xff0c;什么对象池&#xff0c;连接池&#xff0c;线程池…… Java架构师&…