排列与组合的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); } }?
轉載于:https://www.cnblogs.com/longhs/archive/2013/06/14/3135433.html
總結
以上是生活随笔為你收集整理的排列与组合的Java递归实现 (参考)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创业项目计划书样本
- 下一篇: Java 如何生成 UUID