字典序全排列(java實現)

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);
   }
}
相關文章
相關標籤/搜索