全排列——交換法


為了方便大家理解,我盡量寫的淺顯易懂,同時希望大家把不理解的發到評論中,我會盡所能,幫助你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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM