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

本文介绍了如何使用Java实现字符串的全排列算法,通过代码分析和运行结果展示,帮助理解算法的工作原理。文章提供了详细的过程展示,包括三趟全排列的详细结果。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值