import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *好比單詞"too" 它的全排列是"oot","oto","too" *1,從右端開始掃描,若出現前一個比後一個小,記錄前一個的元素下表index *2,再找出index之後比該元素大的中的最小值的下標,(實現見 下面的getMin方法) *3,index之後的元素實現反轉(實現 見下面的reverse方法) *結束條件:前一個都比後一個大的狀況 */ public class StringExpress{ int getMin(char[]input,int index){ char min=input[index]; int minIndex=index+1; char result='z'; for(int i=index+1;i<input.length;i++){ if(input[i]>min&&input[i]<result){ result=input[i]; minIndex=i; } } return minIndex; } void exchange(char []input,int index,int minIndex){ char temp=input[index]; input[index]=input[minIndex]; input[minIndex]=temp; } void reverse(char input[],int first,int end) { while(first<end){ exchange(input,first,end); first++; end--; } } void getDictionary(char c[]){ System.out.println(new String(c)); //boolean flag=true; int i=0; while(true){ i=c.length-1; for(;i>0;i--){ if(c[i-1]<c[i])break; } if(i==0)break; int minIndex=getMin(c,i-1); exchange(c,i-1,minIndex); reverse(c,i,c.length-1); System.out.println(new String(c)); } } public static void main(String []args){ String input="aat"; char [] c=input.toCharArray(); Arrays.sort(c); new StringExpress().getDictionary(c); } }