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

  1. 266. Palindrome Permutation

    /**266. Palindrome Permutation*2016-6-24 by Mingyang *这个题目很简单的是HashSet来做,遇到一样的,就remove,从没出现的就Add*/pu ...

  2. 动态规划 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 ...

  3. 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II

    LeetCode 132. Palindrome Partitioning II Solution1:我的答案1 直接模仿131那道题的DFS解法,找其中size最小的.果不其然,因为超时只能部分AC ...

  4. quartus II工具In-System Memory Content Editor使用方法

    quartus II工具In-System Memory Content Editor使用方法 很多情况我们在做一个项目时,会在FPGA中内嵌一些RAM或ROM,当然一般我们都会使用quartus自带 ...

  5. 《铁血联盟II:野火中文版》 免光驱方法

    这是很久以前,自己第一次去破解一个东西. 拿出来 留作纪念. <铁血联盟II:野火中文版> 免光驱方法 修改 WF5.exe找到84 C0 75 1F 改为 84 C0 EB 1F 就是把 ...

  6. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  7. LeetCode Palindrome Partitioning II

    原题链接在这里:https://leetcode.com/problems/palindrome-partitioning-ii/ 题目: Given a string s, partition s  ...

  8. Palindrome Permutation

    通过奇偶数来判断回文,很好. public class Solution {public boolean canPermutePalindrome(String s) {if (s == null | ...

  9. Palindrome(最长公共子序列 + 滚动数组优化)

    描述 A palindrome is a symmetrical string, that is, a string read identically from left to right as we ...

最新文章

  1. 使用Java辅助类(CountDownLatch、CyclicBarrier、Semaphore)并发编程
  2. CountUp.js – 让数字以非常有趣的动画方式显示
  3. 机器学习笔记:梯度消失
  4. Ubuntu下一个好用的终端
  5. 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
  6. 大型网站架构的演化[转]
  7. 微信小程序比较用户微信客户端版本号
  8. 年审是当月还是当天_车辆年审到期是指当月吗?
  9. 【BZOJ 3894】 文理分科
  10. 腾讯网页登陆的加密机制
  11. WWDC21主题演讲6 月 8 日凌晨1点开幕
  12. Oracle运维手册
  13. 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,详细教您如何解决
  14. b2b2c商城系统开发
  15. 不是微型计算机硬件组装需要做到的,微型计算机的硬件组装.ppt
  16. 调研套接字server bind 失败的原因?——Address already in use
  17. 史上最最最靠谱的ubantu 18.04 显卡超频教程;以及核显输出图像,独显用于计算教程;附带无显示器超频教程
  18. Spring DAO(3):Spring 事务管理
  19. spark使用性能优化记录——二
  20. html实体编码 在线,HTML实体字符编码集(10页)-原创力文档

热门文章

  1. [python]No module named ‘bs4‘
  2. VGGNet论文翻译-Very Deep Convolutional Networks for Large-Scale Image Recognition
  3. P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
  4. C语言中简单的题目,C语言的一些简单题目,没有答案,哪位大神帮忙做一下!!!...
  5. linux php7 composer,Linux 系统 Composer 安装
  6. Java Log4j日志简单配置
  7. Windows 帐号管理相关操作
  8. 聊聊零基础的我是如何学python的_零基础学python-4.3 对象的比较
  9. 基础html的网页,[网页设计]HTML基础(五)——
  10. 南开大学滨海学院计算机科学系,【公示】南开大学滨海学院2019届“优秀毕业生”、“十佳毕业生” 评选结果公示...