字串全排列 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,所有的排列都輸出來了。