1. 程式人生 > >字串排列和組合的JAVA實現

字串排列和組合的JAVA實現

字串的組合:

給一個字串,比如ABC, 把所有的組合,即:A, B, C, AB, AC, BC, ABC, 都找出來。

解題思路:

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

字串的排列:

  1. publicstaticvoid combiantion(char chs[]){  
  2.     if(chs.length == 
    0return ;  
  3.     Stack<Character> stack = new Stack<Character>();  
  4.     for(int i = 1; i <= chs.length; i++){  
  5.         combine(chs, 0, i, stack);  
  6.     }  
  7. }  
  8. //從字元陣列中第begin個字元開始挑選number個字元加入list中
  9. publicstaticvoid combine(char []chs, int begin, int number, Stack<Character> stack){  
  10.        if(number == 0){  
  11.         System.out.println(stack.toString());  
  12.         return ;  
  13.        }  
  14.        if(begin == chs.length){  
  15.         return;  
  16.        }  
  17.        stack.push(chs[begin]);  
  18.        combine(chs, begin + 1, number - 1, stack);  
  19.        stack.pop();  
  20.        combine(chs, begin + 1
    , number, stack);  
  21. }  

給一個字串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出來。

解題思路:

對於一個n 位的字串來講,它是n-1位字串的排列 加上 沒有在 n -1 位字串裡 那個字元 的排列。 有點難理解,用例子說明:

對於字串ABC來講,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。

而BC的排列是 B + C 的排列 加上 C + B 的排列。

所以,對一個字串,我們從中去一個值,然後求剩餘部分的排列,然後把它們再組合在一起。所有,程式碼如下:

  1. // str has been sorted.
  2.     publicstatic LinkedList<String> permutation(String str) {  
  3.         LinkedList<String> linkedString = new LinkedList<String>();   
  4.         if (str.length() <= 1) {  
  5.             linkedString.add(str);  
  6.             return linkedString;  
  7.         }   
  8.         for (int i = 0; i < str.length() ; i++) {  
  9.             char ch = str.charAt(i);  
  10.             //consider the case in which the characters may be duplicated.
  11.             if (i > 0 && ch == str.charAt(i - 1)) {  
  12.                 continue;  
  13.             }  
  14.             String newStr = remove(str, i);  
  15.             LinkedList<String> newStrList= permutation(newStr);   
  16.             for (int j = 0; j < newStrList.size(); j++) {  
  17.                 linkedString.add(ch + newStrList.get(j));  
  18.             }  
  19.         }  
  20.         return linkedString;  
  21.     }  
  22.     //remove the ith character from the string
  23.     publicstatic String remove(String str, int i) {  
  24.         if (i == 0return str.substring(1, str.length());  
  25.         if (i == str.length() - 1return str.substring(0, i );  
  26.         return str.substring(0, i) + str.substring(i + 1, str.length());  
  27.     }  

這裡貼出另一個permutation 的版本:

  1. staticvoid swap(char[] arr, int idx1, int idx2) {  
  2.     char temp = arr[idx1];  
  3.     arr[idx1] = arr[idx2];  
  4.     arr[idx2] = temp;  
  5. }  
  6. staticvoid permutation(char[] arr, int index, int size) {  
  7.     if (index == size) {  
  8.         for (int i = 0; i < arr.length; i++) {  
  9.             System.out.print(arr[i] + " ");  
  10.         }  
  11.         System.out.println();  
  12.     } else {  
  13.         for (int i = index; i < size; i++) {  
  14.             if(i != index && arr[i] == arr[index])  
  15.                 continue;  
  16.             swap(arr, i, index);  
  17.             permutation(arr, index+1, size);  
  18.             swap(arr, i, index);  
  19.         }  
  20.     }  
  21. }  
  22.    }