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