267. Palindrome Permutation II --back tracking 以及palindrome 的优化方法ing
产生input中 所有permutation 中符合 palindrome 的。 Input:"aabb"
Output:["abba", "baab"] 分析: 和47. Permutations II 本质上一样的,首先字母有重复的,因此为了避免重复解,得先排序。47题example
Input: [1,1,2] Output: [[1,1,2],[1,2,1],[2,1,1] ]
然而写了一个类似47的解竟然TLE了,
优化策略1. 统计整个字符串中每个字母的个数,如果奇数个的个数>1 ,则所有的permutation 都不可能符合要求。
做了这个优化后写了如下code, 但时间复杂度太高,排到了 0.0%了吧,算法复杂度为o(n!)
1 class Solution { 2 public List<String> generatePalindromes(String s) { 3 List<String> result = new ArrayList<>(); 4 int[] map = new int[128]; 5 if (!canPermutePalindrome(s, map)) 6 return new ArrayList < > (); 7 char[] ch = s.toCharArray(); 8 Arrays.sort(ch); 9 dfs(new StringBuilder(), result, ch,new boolean[s.length()]); 10 return result; 11 } 12 13 private void dfs(StringBuilder curResult, List<String> result, char[] ch, boolean[] used){ 14 if(curResult.length() == ch.length){ 15 //System.out.println(curResult); 16 String candid = curResult.toString(); 17 if(isPalindromes(candid)){ 18 result.add(candid); 19 } 20 return; 21 } 22 23 for(int i=0; i<ch.length; i++){ 24 if(used[i] || i>0 && ch[i] == ch[i-1] && !used[i-1]) continue; 25 26 curResult.append(ch[i]); 27 used[i] = true; 28 dfs(curResult,result,ch,used); 29 curResult.setLength(curResult.length()-1); 30 used[i] = false; 31 32 } 33 } 34 35 private boolean isPalindromes(String s){ 36 int len = s.length(); 37 for(int i=0; i<len/2;i++){ 38 if(s.charAt(i) != s.charAt(len-i-1)) return false; 39 } 40 return true; 41 } 42 43 public boolean canPermutePalindrome(String s, int[] map) { 44 int count = 0; 45 for (int i = 0; i < s.length(); i++) { 46 map[s.charAt(i)]++; 47 if (map[s.charAt(i)] % 2 == 0) 48 count--; 49 else 50 count++; 51 } 52 return count <= 1; 53 } 54 }
看了 solution 里的优化方法, 可以优化到 o(n/2!) 而不是 o(n!) 每次只要build 一半的字符串就够了。
转载于:https://www.cnblogs.com/keepAC/p/9961393.html
267. Palindrome Permutation II --back tracking 以及palindrome 的优化方法ing相关推荐
- 266. Palindrome Permutation
/**266. Palindrome Permutation*2016-6-24 by Mingyang *这个题目很简单的是HashSet来做,遇到一样的,就remove,从没出现的就Add*/pu ...
- 动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列...
题意:寻找子数组的和最大. 思路:设置dp数组来保存到第i位的最大和. 判断第i-1位的正负,若dp[i-1]<0 则 dp[i] = nums[i]; 若 dp[i-1] > 0 则 d ...
- 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II
LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...
- quartus II工具In-System Memory Content Editor使用方法
quartus II工具In-System Memory Content Editor使用方法 很多情况我们在做一个项目时,会在FPGA中内嵌一些RAM或ROM,当然一般我们都会使用quartus自带 ...
- 《铁血联盟II:野火中文版》 免光驱方法
这是很久以前,自己第一次去破解一个东西. 拿出来 留作纪念. <铁血联盟II:野火中文版> 免光驱方法 修改 WF5.exe找到84 C0 75 1F 改为 84 C0 EB 1F 就是把 ...
- 【leetcode】132. Palindrome Partitioning II
题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...
- LeetCode Palindrome Partitioning II
原题链接在这里:https://leetcode.com/problems/palindrome-partitioning-ii/ 题目: Given a string s, partition s ...
- Palindrome Permutation
通过奇偶数来判断回文,很好. public class Solution {public boolean canPermutePalindrome(String s) {if (s == null | ...
- Palindrome(最长公共子序列 + 滚动数组优化)
描述 A palindrome is a symmetrical string, that is, a string read identically from left to right as we ...
最新文章
- 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
- CountUp.js – 让数字以非常有趣的动画方式显示
- 机器学习笔记:梯度消失
- Ubuntu下一个好用的终端
- 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
- 大型网站架构的演化[转]
- 微信小程序比较用户微信客户端版本号
- 年审是当月还是当天_车辆年审到期是指当月吗?
- 【BZOJ 3894】 文理分科
- 腾讯网页登陆的加密机制
- WWDC21主题演讲6 月 8 日凌晨1点开幕
- Oracle运维手册
- 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,详细教您如何解决
- b2b2c商城系统开发
- 不是微型计算机硬件组装需要做到的,微型计算机的硬件组装.ppt
- 调研套接字server bind 失败的原因?——Address already in use
- 史上最最最靠谱的ubantu 18.04 显卡超频教程;以及核显输出图像,独显用于计算教程;附带无显示器超频教程
- Spring DAO(3):Spring 事务管理
- spark使用性能优化记录——二
- html实体编码 在线,HTML实体字符编码集(10页)-原创力文档
热门文章
- [python]No module named ‘bs4‘
- VGGNet论文翻译-Very Deep Convolutional Networks for Large-Scale Image Recognition
- P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
- C语言中简单的题目,C语言的一些简单题目,没有答案,哪位大神帮忙做一下!!!...
- linux php7 composer,Linux 系统 Composer 安装
- Java Log4j日志简单配置
- Windows 帐号管理相关操作
- 聊聊零基础的我是如何学python的_零基础学python-4.3 对象的比较
- 基础html的网页,[网页设计]HTML基础(五)——
- 南开大学滨海学院计算机科学系,【公示】南开大学滨海学院2019届“优秀毕业生”、“十佳毕业生” 评选结果公示...