1. 程式人生 > >排列與組合的Java遞迴實現 (參考)

排列與組合的Java遞迴實現 (參考)

我們在筆試面試過程中經常會遇到關於排列與組合的問題,其實這些可以通過遞迴簡單的實現,看下面兩個例子:

(1)關於字串排列的問題

輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab和cba。

可以這樣想:固定第一個字元a,求後面兩個字元bc的排列。當兩個字元bc的排列求好之後,我們把第一個字元a和後面的b交換,得到bac,接著我們固定第一個字元b,求後面兩個字元ac的排列。現在是把c放到第一位置的時候了。記住前面我們已經把原先的第一個字元a和後面的b做了交換,為了保證這次c仍然是和原先處在第一位置的a交換,我們在拿c和第一個字元交換之前,先要把b和a交換回來。在交換b和a之後,再拿c和處在第一位置的a進行交換,得到cba。我們再次固定第一個字元c,求後面兩個字元b、a的排列。這樣寫成遞迴程式如下:

複製程式碼
public class Permutation {  
    public static void permutation(char[]ss,int i){  
        if(ss==null||i<0 ||i>ss.length){  
            return;  
        }  
        if(i==ss.length){  
            System.out.println(new String(ss));  
        }else{  
            for(int j=i;j<ss.length;j++){  
                char
temp=ss[j];//交換字首,使之產生下一個字首 ss[j]=ss[i]; ss[i]=temp; permutation(ss,i+1); temp=ss[j]; //將字首換回來,繼續做上一個的字首排列. ss[j]=ss[i]; ss[i]=temp; } } } public static void main(String args[]){ char
[]ss={'a','c','b','d'}; permutation(ss,0); } }
複製程式碼

(2)關於組合的問題

輸入一個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。

假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃描字串的第一個字元。針對第一個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;二是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞迴實現。

複製程式碼
import java.util.ArrayList;  
import java.util.List;  
import java.util.Queue;  
public class Combination {  
    public static void combiantion(char chs[]){  
        if(chs==null||chs.length==0){  
            return ;  
        }  
        List<Character> list=new ArrayList();  
        for(int i=1;i<=chs.length;i++){  
            combine(chs,0,i,list);  
        }  
    }  
    //從字元陣列中第begin個字元開始挑選number個字元加入list中  
    public static void combine(char []cs,int begin,int number,List<Character> list){  
        if(number==0){  
            System.out.println(list.toString());  
            return ;  
        }  
        if(begin==cs.length){  
            return;  
        }  
        list.add(cs[begin]);  
        combine(cs,begin+1,number-1,list);  
        list.remove((Character)cs[begin]);  
        combine(cs,begin+1,number,list);  
    }  
    public static void main(String args[]){  
        char chs[]={'a','b','c'};  
        combiantion(chs);  
    }  
}  
複製程式碼