Java实现的字符串全排列算法

时间:2021-05-10 09:54:10

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

目录