全排列——交换法

为了方便大家理解,我尽量写的浅显易懂,同时希望大家把不理解的发到评论中,我会尽所能,帮助你l理解。

欢迎qq进行交流问题: 

      本人QQ :1770115451             算法交流群: 1061907071

题目描述:

  请编写一个方法,确定某字符串所有的排列组合,给定一个字符串,请返回该字符串的所有排列

   例如: “ABC”  的全排列结果为:ABC 、ACB、BAC、BCA、CAB、CBA

  (题意:就是一个字符串的每一个字符重新排列出的所有的结果)

解题方法:交换法

  原理假设以字符串第0个位置(也就是第一个字符)为起点,分别与后面的每一个位置对应的字符进行交换。直到k等于字符串最后一个位置时,就会排列出新的组合

   说明:交换法涉及到多路递归,和回溯等问题,理解起来有点抽象,具体过步骤和代码已经写在下面,结合图和代码理解,会好理解,不懂的可以评论,我看到一定会解答。

实现步骤:

  前提:需要将字符串转为字符数组      char arr[]=str.toCharArray();

     第一步:创建一个用于返回结果的res数组

 第二步,当k=chs.length的时候,说明一种排列方式已经交换好了,并将该结果添加到res中(递归的出口) 
 第三步:交换法(一定要回溯)

关键代码

//交换法代码(多路递归,回溯)
    
    //第一步:创建一个用于返回结果的res数组
    static ArrayList<String>   res = new  ArrayList<>();
    
    public static void   permutation(char[]arr,int k){ //arr为字符数组,k代表对应的状态
    //第二步,当k=chs.length的时候,说明一种排列方式已经交换好了,并将该结果添加到res中(递归的出口)    
        if(k==arr.length){
            res.add(new String(arr)); //new String()是将字符数组转为字符串数组。
        }
    //第三步:交换法的核心
        //以第k个字符为起点,依次与后面位置的元素进行交换,产生新的组合。
        for(int i=k;i<arr.length;i++){
            swap(arr, k, i);//将k和i对应的字符进行交换
            permutation(arr, k+1);  //交换完成后,继续交换下一个状态的字符,直到k=arr.length
            swap(arr,k,i); //交换完毕后,由于下一次交换是由上一次的状态取决的,所以必须回溯到上一个状态
        }
    }
//交换数组元素代码
    public static void swap(char[]arr,int i,int j){
        char   temp=arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

 

posted @ 2020-04-06 00:17  木原纺  阅读(1890)  评论(0编辑  收藏  举报