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
原创粉丝点击