字符串所有排列组合暴力递归
给你一个字符串"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;}
字符串所有排列组合暴力递归相关推荐
- 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)
仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...
- 无重复字符串的排列组合
无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1: 输入:S = "qwe" 输出:["qwe", " ...
- leetcode面试题 08.08. 有重复字符串的排列组合(回溯)
有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq",&q ...
- 程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合(回溯)
1. 题目 无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1:输入:S = "qwe"输出:["qwe", & ...
- java字符串字符排列组合_如何在Java中查找字符串的所有排列
java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...
- JAVA练习177-有重复字符串的排列组合
有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq", ...
- 面试题 08.08. 有重复字符串的排列组合-快速排序+回溯深度优先搜索
面试题 08.08. 有重复字符串的排列组合+快速排序加回溯深度优先搜索 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输 ...
- 面试题 08.08. 有重复字符串的排列组合
面试题 08.08. 有重复字符串的排列组合 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq&qu ...
- 数据结构与算法--字符串的排列组合问题
字符串的全排列 题目:输入一个字符串,打印出改字符串中所有字符的所有排列.例如输入字符串abc,那么打印出由a,b,c字符组成的所有字符串:abc,acb,bac,bca,cab,cba 如何求解全排 ...
最新文章
- Linux系统与我之间的故事
- 微服务为什么一定要用docker ?
- Android中怎样使用createTempFile实现将字节数据创建到临时文件并转换成FileOutputStream和FileInputStream
- Memcached服务器的图形化管理工具
- 读者吐槽:Go 面试总被问到 RPC
- MySQL基本分区表
- 【做题记录】CF1444A Division
- js for循环_JS 函数的执行时机(深入理解6个6)
- Spark GraphX相关使用方法
- 基于HTML5的Web SCADA工控移动应用
- mysqld --debug-sync
- 翻译:Swift 5.1中的Protocol面向协议的编程教程:从入门到精通
- IOS上架时及开发注意事项
- 35岁的程序员:第12章,林菲菲
- iOS App技术支持网址(URL)
- 超微服务器型号,超微服务器主机配置raid
- 大型医院HIS系统源码 优质源码 医院管理系统源码
- 【C++】不同模板对象之间赋值
- python自动化办公入门故事教案_Python自动化办公知识点整理汇总
- 5 种最常见的 DNS 故障诊断及问题处理方法
热门文章
- Java黑皮书课后题第10章:*10.11(几何:Circle2D类)定义Circle2D类
- java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用
- paramiko 使用总结(SSH 操作远端机器)
- 深入学习c++--智能指针(三) unique_ptr
- [HNOI2008]GT考试
- wireshark抓包分析tcp连接与断开
- Linux 用户篇——用户管理的配置文件
- 配置 docker0 网桥
- nginx反向代理下thinkphp、php获取不到正确的外网ip
- kali2020提高权限到root