1. 程式人生 > >字串全排列 Java遞迴實現

字串全排列 Java遞迴實現

思路:

      字串的全排列和數字的全排列類似,舉個例子:字串為“ABC”,按照我們所學數學上的邏輯,先取出A,放入首位,

剩下BC有兩種全排列情況,即ABC,ACB,同理,將A分別與B,C交換,於是字串"ABC"的全排列總共有6種。

如何將這種邏輯轉換為程式碼:首先,可以肯定是要用到交換,其次有以上分析,可以想到用遞迴:

設一組數p = {r1, r2, r3, ... ,rn}, 全排列為perm(p),pn = p - {rn}。

因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。當n = 1時perm(p} = r1。

程式碼如下:

public class permutate { //全排列
	public static int count=0;
    public static void swap(String str[],int i,int j){
		 String temp=new String();
		 temp=str[i];
		 str[i]=str[j];
		 str[j]=temp;
	}
    public static void allPermutate(String str[],int k,int length){
    	if(k==length-1){
    		for(int i=0;i<length;i++){
    			System.out.print(str[i]+" ");
    		}
    		System.out.println();
    		count++;
    	}else{
    		for(int i=k;i<length;i++){
    		     swap(str,k,i);
    		     allPermutate(str, k+1, length);
    		     swap(str,k,i);
    		}
    	}
    }
    
	public static void main(String[] args) {
		String[] str={"A","B","C"};
		allPermutate(str, 0, str.length);
		System.out.println(count);
	}   

}

關鍵是allPermutate方法的else裡的內容,首先用i從str[k]開始迴圈遍歷,每一次迴圈中,都要將str[k]與str[i]互相調換位置:

第一次交換,"A"與自己換,這時候,遞迴呼叫 allPermutate(str, k+1, length)這是在求取str[k+1...length - 1]的排列

即"b","c"的排列;第二次交換, "A"與"B"互相調換,遞迴呼叫allPermutate(str, k+1, length)就是在求取{"A","C"}的排列。

第三次,"A"與"C"互相調換,遞迴呼叫allPermutate(str, k+1, length)就是在求取{"B","A

"}的排列。

再以求"B","C"的排列為例:

首先還是迴圈,第一次,"B"與自己調換,這時候,呼叫allPermutate(str, k+1, length)就是求c的排列,我們都知道一個數的

全排列就是該數本身。這也是函式遞迴呼叫的出口,此時k = length - 1。輸出BC;

第二次,同理,輸出CB;

此時加上前面的A,即ABC,ACB,BAC,BCA,CBA,CAB,所有的排列都輸出來了。