我們在筆試面試過程中經常會遇到關於排列與組合的問題,其實這些可以通過遞歸簡單的實現,看下面兩個例子:
(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的排列。這樣寫成遞歸程序如下:
import java.util.Scanner; public class StringAllConbinations {
public static void permutateSequence(char[] strArrs,int i){ char temp; if(strArrs==null||i>strArrs.length||i<0){ return; } else if(i==strArrs.length){ System.out.println(strArrs); } else{ for(int j=i;j<strArrs.length;j++){ temp = strArrs[j];//
strArrs[j] = strArrs[i]; strArrs[i] = temp; permutateSequence(strArrs, i+1); temp = strArrs[j];// strArrs[j] = strArrs[i]; strArrs[i] = temp; } } } public static voi main(String[] args) { Scanner in = new Scanner(System.in); String str = in.nextLine(); char strArrs[] = str.toCharArray(); permutateSequence(strArrs, 0); } }
(2)關於組合的問題
輸入一個字符串,輸出該字符串中字符的所有組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc。
假設我們想在長度為n的字符串中求m個字符的組合。我們先從頭掃描字符串的第一個字符。針對第一個字符,我們有兩種選擇:一是把這個字符放到組合中 去,接下來我們需要在剩下的n-1個字符中選取m-1個字符;二是不把這個字符放到組合中去,接下來我們需要在剩下的n-1個字符中選擇m個字符。這兩種 選擇都很容易用遞歸實現。