字符串數組元素排列與組合的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的排列。這樣寫成遞歸程序如下:

 

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個字符。這兩種 選擇都很容易用遞歸實現。

 1 import java.util.ArrayList;  2 import java.util.List;  3 import java.util.Queue;  4 public class Combination {  5 public static void combiantion(char chs[]){  6 if(chs==null||chs.length==0){  7 return ;  8  }  9 List<Character> list=new ArrayList(); 10 for(int i=1;i<=chs.length;i++){ 11 combine(chs,0,i,list); 12  } 13  } 14 //從字符數組中第begin個字符開始挑選number個字符加入list中  15 public static void combine(char []cs,int begin,int number,List<Character> list){ 16 if(number==0){ 17  System.out.println(list.toString()); 18 return ; 19  } 20 if(begin==cs.length){ 21 return; 22  } 23  list.add(cs[begin]); 24 combine(cs,begin+1,number-1,list); 25  list.remove((Character)cs[begin]); 26 combine(cs,begin+1,number,list); 27  } 28 public static void main(String args[]){ 29 char chs[]={'a','b','c'}; 30  combiantion(chs); 31  } 32 }  

 


免責聲明!

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



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