Java实现的字符串全排列算法
来源:互联网 发布:淘宝企业店铺推广 编辑:程序博客网 时间:2024/04/19 01:17
Java实现的字符串全排列算法
说明
本方法的代码参考了网上的资料,本文只对方法的运行结果进行输出并对代码进行分析。 —— [ 参考代码 ]
代码块
实现全排列的java方法
import java.util.ArrayList;import java.util.Collections;/** * @author * */public class Main{ public static void main(String[] args){ ArrayList<Integer> list = new ArrayList<Integer>(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); calperm(list, 0); } /** * @param list * @param n * 递归方法产生全排列。 * 方法的总体思想: * 1、固定第一个位置的字符,针对余下的字符串递归调用全排列方法。每一个字符都要有做第一个字符的机会, * 所以有多少个字符,就要进行多少次与第一个字符的交换 * 2、递归调用的过程如1.中依次类推 * 2、在递归调用结束后,需要将递归调用前交换过的字符恢复原样,即做了什么改变,就要对什么改变进行复原!!!这一点很重要!! * */ public static void calperm(ArrayList<Integer> list, int n){ if(n == list.size()){ System.out.println(list.toString()); }else{ for(int i=n;i<list.size();i++){ System.out.println("当前第n个层次的全排列,n=" + n); System.out.println(list.toString()+" 当前递归开始交换前的序列."); Collections.swap(list, i, n); System.out.println(list.toString()+" 开始递归下一层前,交换了i和n后的序列.其中n="+n+" i="+i+" n表示当前是第n次循环,i表示第n次循环的第i趟比较"); calperm(list, n+1);//进行下一层次的递归调用。 System.out.println(list.toString()+" 子递归结束后,恢复交换前的序列."+" 这是第n层次的循环,此时n="+n); Collections.swap(list, i, n);//至关重要的一点!!!!如果不恢复之前做的改变,将直接影响后续几趟的循环递归!!!! System.out.println(list.toString()+" 子递归结束后,恢复交换后的序列."+" 这是第n层次的循环,此时n="+n); } } }}
方法运行结果
从本方法的运行结果,可以很快的理解这个方法。特别是最后一步恢复交换的作用。
第一趟的全排列过程产生的详细结果:
当前第n个层次的全排列,n=0[1, 2, 3] 当前递归开始交换前的序列.[1, 2, 3] 开始递归下一层前,交换了i和n后的序列.其中n=0 i=0 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=1[1, 2, 3] 当前递归开始交换前的序列.[1, 2, 3] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=1 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[1, 2, 3] 当前递归开始交换前的序列.[1, 2, 3] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[1, 2, 3][1, 2, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[1, 2, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1当前第n个层次的全排列,n=1[1, 2, 3] 当前递归开始交换前的序列.[1, 3, 2] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[1, 3, 2] 当前递归开始交换前的序列.[1, 3, 2] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[1, 3, 2][1, 3, 2] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[1, 3, 2] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[1, 3, 2] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1[1, 2, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=0[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=0
第二趟的全排列过程产生的详细结果:
当前第n个层次的全排列,n=0[1, 2, 3] 当前递归开始交换前的序列.[2, 1, 3] 开始递归下一层前,交换了i和n后的序列.其中n=0 i=1 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=1[2, 1, 3] 当前递归开始交换前的序列.[2, 1, 3] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=1 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[2, 1, 3] 当前递归开始交换前的序列.[2, 1, 3] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[2, 1, 3][2, 1, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[2, 1, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[2, 1, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[2, 1, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1当前第n个层次的全排列,n=1[2, 1, 3] 当前递归开始交换前的序列.[2, 3, 1] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[2, 3, 1] 当前递归开始交换前的序列.[2, 3, 1] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[2, 3, 1][2, 3, 1] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[2, 3, 1] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[2, 3, 1] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[2, 1, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1[2, 1, 3] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=0[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=0
第三趟的全排列过程产生的详细结果:
当前第n个层次的全排列,n=0[1, 2, 3] 当前递归开始交换前的序列.[3, 2, 1] 开始递归下一层前,交换了i和n后的序列.其中n=0 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=1[3, 2, 1] 当前递归开始交换前的序列.[3, 2, 1] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=1 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[3, 2, 1] 当前递归开始交换前的序列.[3, 2, 1] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[3, 2, 1][3, 2, 1] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[3, 2, 1] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[3, 2, 1] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[3, 2, 1] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1当前第n个层次的全排列,n=1[3, 2, 1] 当前递归开始交换前的序列.[3, 1, 2] 开始递归下一层前,交换了i和n后的序列.其中n=1 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较当前第n个层次的全排列,n=2[3, 1, 2] 当前递归开始交换前的序列.[3, 1, 2] 开始递归下一层前,交换了i和n后的序列.其中n=2 i=2 n表示当前是第n次循环,i表示第n次循环的第i趟比较[3, 1, 2][3, 1, 2] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=2[3, 1, 2] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=2[3, 1, 2] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=1[3, 2, 1] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=1[3, 2, 1] 子递归结束后,恢复交换前的序列. 这是第n层次的循环,此时n=0[1, 2, 3] 子递归结束后,恢复交换后的序列. 这是第n层次的循环,此时n=0
目录
- Java实现的字符串全排列算法
- 说明
- 代码块
- 方法运行结果
- 目录
0 0
- Java实现的字符串全排列算法
- [算法学习]Java实现字符串全排列
- java实现给定字符串之间的全排列算法
- java字符串全排列的实现方式
- Java实现字符串的全排列
- java算法字符串全排列
- 全排列算法的java实现
- 全排列字符串java实现
- 字符串全排列 java实现
- 字符串全排列 java实现
- 字符串的全排列算法
- 【算法】字符串的全排列
- 算法-字符串的全排列
- 字符串全排列算法理解与java实现
- 全排列算法(Java实现)
- 全排列算法【java实现】
- 全排列算法java实现
- Java 实现全排列算法
- java一些基本知识(配置、debug调试、快捷键、junit test)
- 数据结构-栈:顺序栈与链栈的C++模板类实现
- 图的深度优先遍历
- 深入浅出SQL:4 聪明的表设计
- BZOJ4502: 串
- Java实现的字符串全排列算法
- mysql的安装,卸载,hive的安装。
- QT_RCC
- Sublime突然运行不了python文件_提示FileNotFoundError(2,'')
- android 短/彩信数据表不能插入
- poj 1061 青蛙的约会
- UE4中动态时钟蓝图
- Java之异常处理
- Ubuntu 14.04 gcc降级为4.7.x版本