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


 

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

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

輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則輸出由字符abc所能排列出來的所有字符串abcacbbacbcacabcba

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

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);  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM