给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很多空间,在数组内原地交换,遍历到每一个字符上也有很多细节,将后面的每一个字符和当前字符进行交换,并且每次遍历完一个,这个字符就不要在动了,随后再还原现场。

     public static void main(String[] args) {String input = "abz";HashSet<String> res = new HashSet<>();printAllPermutation(input, res);for (String re : res) {System.out.println(re);}}private static void printAllPermutation(String input, HashSet<String> res) {char[] sChars = input.toCharArray();process(sChars, 0, res);}private static void process(char[] sChars, int index, HashSet<String> res) {if (index == sChars.length) {res.add(new String(sChars));return;}for (int j = index; j < sChars.length; j++) {swap(sChars, index, j);process(sChars, index + 1, res);swap(sChars, index, j);         }}private static void swap(char[] sChars, int index, int j) {char tmp = sChars[index];sChars[index] = sChars[j];sChars[j] = tmp;}

改进:加入缓存,因为每次交换过来的这个字符如果一样的话,后面结果是相同的,没必要再排列了

    public static void main(String[] args) {String input = "abz";HashSet<String> res = new HashSet<>();printAllPermutation(input, res);for (String re : res) {System.out.println(re);}}private static void printAllPermutation(String input, HashSet<String> res) {char[] sChars = input.toCharArray();process(sChars, 0, res);}private static void process(char[] sChars, int index, HashSet<String> res) {if (index == sChars.length) {res.add(new String(sChars));return;}boolean[] cache = new boolean[26];for (int j = index; j < sChars.length; j++) {if (!cache[sChars[j] - 'a']) {cache[sChars[j] - 'a'] = true;swap(sChars, index, j);process(sChars, index + 1, res);swap(sChars, index, j);}}}private static void swap(char[] sChars, int index, int j) {char tmp = sChars[index];sChars[index] = sChars[j];sChars[j] = tmp;}

字符串所有排列组合暴力递归相关推荐

  1. 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)

    仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...

  2. 无重复字符串的排列组合

    无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1: 输入:S = "qwe" 输出:["qwe", " ...

  3. leetcode面试题 08.08. 有重复字符串的排列组合(回溯)

    有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq",&q ...

  4. 程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合(回溯)

    1. 题目 无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1:输入:S = "qwe"输出:["qwe", & ...

  5. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  6. JAVA练习177-有重复字符串的排列组合

    有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1:  输入:S = "qqe"  输出:["eqq","qeq", ...

  7. 面试题 08.08. 有重复字符串的排列组合-快速排序+回溯深度优先搜索

    面试题 08.08. 有重复字符串的排列组合+快速排序加回溯深度优先搜索 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输 ...

  8. 面试题 08.08. 有重复字符串的排列组合

    面试题 08.08. 有重复字符串的排列组合 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq&qu ...

  9. 数据结构与算法--字符串的排列组合问题

    字符串的全排列 题目:输入一个字符串,打印出改字符串中所有字符的所有排列.例如输入字符串abc,那么打印出由a,b,c字符组成的所有字符串:abc,acb,bac,bca,cab,cba 如何求解全排 ...

最新文章

  1. Linux系统与我之间的故事
  2. 微服务为什么一定要用docker ?
  3. Android中怎样使用createTempFile实现将字节数据创建到临时文件并转换成FileOutputStream和FileInputStream
  4. Memcached服务器的图形化管理工具
  5. 读者吐槽:Go 面试总被问到 RPC
  6. MySQL基本分区表
  7. 【做题记录】CF1444A Division
  8. js for循环_JS 函数的执行时机(深入理解6个6)
  9. Spark GraphX相关使用方法
  10. 基于HTML5的Web SCADA工控移动应用
  11. mysqld --debug-sync
  12. 翻译:Swift 5.1中的Protocol面向协议的编程教程:从入门到精通
  13. IOS上架时及开发注意事项
  14. 35岁的程序员:第12章,林菲菲
  15. iOS App技术支持网址(URL)
  16. 超微服务器型号,超微服务器主机配置raid
  17. 大型医院HIS系统源码 优质源码 医院管理系统源码
  18. 【C++】不同模板对象之间赋值
  19. python自动化办公入门故事教案_Python自动化办公知识点整理汇总
  20. 5 种最常见的 DNS 故障诊断及问题处理方法

热门文章

  1. Java黑皮书课后题第10章:*10.11(几何:Circle2D类)定义Circle2D类
  2. java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用
  3. paramiko 使用总结(SSH 操作远端机器)
  4. 深入学习c++--智能指针(三) unique_ptr
  5. [HNOI2008]GT考试
  6. wireshark抓包分析tcp连接与断开
  7. Linux 用户篇——用户管理的配置文件
  8. 配置 docker0 网桥
  9. nginx反向代理下thinkphp、php获取不到正确的外网ip
  10. kali2020提高权限到root