目錄數組
1 問題描述
函數2 解決方案
spa2.1 遞歸實現
code2.2 字典序排列實現
blog
輸入一個字符串,打印出該字符串的全部排列。例如,輸入字符串」abc」,則輸出有字符’a’,’b’,’c’所能排列出來的全部字符串」abc」,」acb」,」bac」,」bca」,」cab」,」cba」。遞歸
從字符串中選出一個字符做爲排列的第一個字符,而後對剩餘的字符進行全排列。如此遞歸處理,從而獲得全部字符的全排列。字符串
具體代碼以下:string
package com.liuzhen.string_1; public class StringArrange {//方法1:遞歸實現 /* * 參數arrayA:給定字符串的字符數組 * 參數start:開始遍歷字符與其後面各個字符將要進行交換的位置 * 參數end:字符串數組的最後一位 * 函數功能:輸出字符串數字的各個字符全排列 */ public void recursionArrange(char[] arrayA,int start,int end){ if(end <= 1) return; if(start == end){ for(int i = 0;i < arrayA.length;i++) System.out.print(arrayA[i]); System.out.println(); } else{ for(int i = start;i <= end;i++){ swap(arrayA,i,start); recursionArrange(arrayA,start+1,end); swap(arrayA,i,start); } } } //交換數組m位置和n位置上的值 public void swap(char[] arrayA,int m,int n){ char temp = arrayA[m]; arrayA[m] = arrayA[n]; arrayA[n] = temp; } public static void main(String[] args){ StringArrange test = new StringArrange(); String A = "abc"; char[] arrayA = A.toCharArray(); test.recursionArrange(arrayA,0,arrayA.length-1); } }
運行結果:io
abc
acb
bac
bca
cba
cab
思想以下:
(1)找到排列中最後(最右)一個升序的首位位置i。
(2)找到排列中第i位右邊最後一個比ai大的位置j。
(3)交換ai和aj的值。
(4)把第i+1位到最後一位的部分進行逆序反轉。
具體代碼以下:
package com.liuzhen.string_1; public class StringArrange { //方法2:字典序排列 /* * 參數arrayA:給定字符串的字符數組 * 函數功能:輸出字符串數組的全部字符的字典序全排列 */ public void dictionaryArrange(char[] arrayA){ System.out.println(String.valueOf(arrayA)); while(allArrange(arrayA)) System.out.println(String.valueOf(arrayA)); } //判斷當前數組arrayA序列是否能夠進行字典序排列,如能夠則進行排列並返回true,不然返回false public boolean allArrange(char[] arrayA){ int i; for(i = arrayA.length-2;(i >= 0) && arrayA[i] > arrayA[i+1];--i); if(i < 0) return false; int k; for(k = arrayA.length-1;(k > i) && arrayA[i] >= arrayA[k];--k); swap(arrayA,i,k); reverseArray(arrayA,i+1,arrayA.length-1); return true; } //將數組中a[m]到a[n]一段元素反序排列 public void reverseArray(char[] arrayN,int m,int n){ while(m < n){ char temp = arrayN[m]; arrayN[m++] = arrayN[n]; arrayN[n--] = temp; } } //交換數組m位置和n位置上的值 public void swap(char[] arrayA,int m,int n){ char temp = arrayA[m]; arrayA[m] = arrayA[n]; arrayA[n] = temp; }
public static void main(String[] args){ StringArrange test = new StringArrange(); String A = "abc"; char[] arrayA = A.toCharArray(); test.dictionaryArrange(arrayA); } }
運行結果:
abc
acb
bac
bca
cab
cba