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出口,目前只是打印出每中全排列的最后一位。。。