字串排列和組合的JAVA實現
阿新 • • 發佈:2019-02-10
字串的組合:
給一個字串,比如ABC, 把所有的組合,即:A, B, C, AB, AC, BC, ABC, 都找出來。
解題思路:
假設我們想在長度為n的字串中求m個字元的組合。我們先從頭掃描字串的第一個字元。針對第一個字元,我們有兩種選擇:一是把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元;二是不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元。這兩種選擇都很容易用遞迴實現。
字串的排列:
- publicstaticvoid combiantion(char chs[]){
-
if(chs.length ==
- Stack<Character> stack = new Stack<Character>();
- for(int i = 1; i <= chs.length; i++){
- combine(chs, 0, i, stack);
- }
- }
- //從字元陣列中第begin個字元開始挑選number個字元加入list中
-
publicstaticvoid combine(char []chs, int begin, int number, Stack<Character> stack){
- if(number == 0){
- System.out.println(stack.toString());
- return ;
- }
- if(begin == chs.length){
- return;
- }
- stack.push(chs[begin]);
- combine(chs, begin + 1, number - 1, stack);
- stack.pop();
-
combine(chs, begin + 1
- }
給一個字串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出來。
解題思路:
對於一個n 位的字串來講,它是n-1位字串的排列 加上 沒有在 n -1 位字串裡 那個字元 的排列。 有點難理解,用例子說明:
對於字串ABC來講,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。
而BC的排列是 B + C 的排列 加上 C + B 的排列。
所以,對一個字串,我們從中去一個值,然後求剩餘部分的排列,然後把它們再組合在一起。所有,程式碼如下:
- // str has been sorted.
- publicstatic LinkedList<String> permutation(String str) {
- LinkedList<String> linkedString = new LinkedList<String>();
- if (str.length() <= 1) {
- linkedString.add(str);
- return linkedString;
- }
- for (int i = 0; i < str.length() ; i++) {
- char ch = str.charAt(i);
- //consider the case in which the characters may be duplicated.
- if (i > 0 && ch == str.charAt(i - 1)) {
- continue;
- }
- String newStr = remove(str, i);
- LinkedList<String> newStrList= permutation(newStr);
- for (int j = 0; j < newStrList.size(); j++) {
- linkedString.add(ch + newStrList.get(j));
- }
- }
- return linkedString;
- }
- //remove the ith character from the string
- publicstatic String remove(String str, int i) {
- if (i == 0) return str.substring(1, str.length());
- if (i == str.length() - 1) return str.substring(0, i );
- return str.substring(0, i) + str.substring(i + 1, str.length());
- }
這裡貼出另一個permutation 的版本:
- staticvoid swap(char[] arr, int idx1, int idx2) {
- char temp = arr[idx1];
- arr[idx1] = arr[idx2];
- arr[idx2] = temp;
- }
- staticvoid permutation(char[] arr, int index, int size) {
- if (index == size) {
- for (int i = 0; i < arr.length; i++) {
- System.out.print(arr[i] + " ");
- }
- System.out.println();
- } else {
- for (int i = index; i < size; i++) {
- if(i != index && arr[i] == arr[index])
- continue;
- swap(arr, i, index);
- permutation(arr, index+1, size);
- swap(arr, i, index);
- }
- }
- }
- }