1 //求n個元素的全排列 2 //abc acb bac bca cab cba 3 4 public class FullPermutation { 5 6 public static void f(char[] data,int k) 7 {//k表示當前的交換位置(關注點),與其后的元素交換 8 9 if(k==data.length){//此處寫length和length-1都可以,前者會溢出但是不會有影響,后者效率更高一點 10 for(int i=0;i<data.length;i++) System.out.print(data[i]+" "); 11 System.out.println(); 12 } 13 14 for(int i=k;i<data.length;i++){ 15 {char t = data[k]; 16 data[k] = data[i]; 17 data[i]=t;}//試探 c b a d 18 f(data,k+1); 19 {char t = data[k]; 20 data[k] = data[i]; 21 data[i]=t;}//回溯,換之后還要換回去 a b c d 22 } 23 } 24 25 public static void f2(char[] data){ 26 27 if(data.length==1){ 28 /*for(int i=0;i<data.length;i++)System.out.print(data[i]+" "); 29 System.out.println();*/ 30 System.out.println(data); 31 } 32 33 for(int i=0;i<data.length;i++){ 34 { 35 char t=data[0]; 36 data[0]=data[i]; 37 data[i]=t; 38 //System.out.println(data[0]); 39 } 40 String str = new String(data); 41 f2(str.substring(1).toCharArray()); 42 { 43 char t=data[0]; 44 data[0]=data[i]; 45 data[i]=t; 46 } 47 } 48 } 49 50 public static void main(String[] args) { 51 char[] data="ABC".toCharArray(); //將“ABCDE”這個字符串轉化成字符數組 52 //f(data,0); 53 f2(data); 54 } 55 }
Notes:
此題選用了兩種方法,
第一種:使用的是f(char[] data,int k)兩個參數,重點在於k指的是當前數組中我們關注的位置;
第二種:采用f2(char[] data),將char類型的數組ABC先轉變成String類型,再截取字串進行交換;
此處我一開始使用的是 toString方法,結果當然不對,因為toString() 方法的作用是:可把一個邏輯值轉換為字符串,並返回結果;
字符數組轉化成字符串應該使用:String str = new String(data);
而這兩種方法都要注意點:這里使用了回溯法,回溯法要注意,交換過后必須要交換回去
ps:第二種辦法暫時還沒找到如何正確打印or出口,目前只是打印出每中全排列的最后一位。。。