字符串的全排列
問題描述:輸入一個字符串,打印出該字符串中字符的所有排列。
例如:輸入字符串“abc”,則輸出由字符a、b、c 所能排列出來的所有字符串“abc”、“acb”、“bac”、“bca”、“cab” 和“cba”。
分析:比較常見的有兩種方法,
? ? ? ? ?第一種方法是可以利用字典序排列來求,這種方法編程比較復雜,讀者可以查閱其他相關資料,這里不再詳細解釋,這種方法的時間復雜度為O(n!)。
? ? ? ? ?第二種方法是分治的思想,我們可以從集合中依次選出每一個元素,作為排列的第一個元素,然后對剩余的元素進行全排列,如此遞歸處理,從而得到所有元素的全排列。
? ? ? ? ? ? ? ? ?以對字符串abc進行全排列為例,我們可以這么做:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 固定a,求后面bc的排列:abc,acb,求好后,a和b交換
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 固定b,求后面ac的排列:bac,bca,求好后,a和c交換
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 固定c,求后面ba的排列:cba,cab。
? ? ? ? ? ? ? ? ?由于全排列總共有n!種排列情況,所以遞歸算法的時間復雜度都為O(n!),這種方法編程比較簡單,讀者需要掌握這個方法。
? ? ? ? ? ? ? ? ?具體的Java代碼如下:
? ? ?
1 import java.util.*; 2 class Test { 3 public static void pailie(StringBuilder str,int low,int high){ 4 if(high<1) //如果字符串長度為1,那么只有一種排列,就是本身,直接輸出并結束 5 { 6 System.out.println(str); 7 return; 8 } 9 if (low== high) //當到最后一位時,直接輸出排列字符串 10 System.out.println(str); 11 else 12 for (int j = low; j <= high; j++) 13 { 14 char ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch);//每一位和后面的進行交換 15 pailie(str, low + 1, high); //求后面部分的排列 16 ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch); //求完后再交換回來 17 } 18 } 19 } 20 21 public class Main { 22 public static void main(String[] args) { 23 StringBuilder str=new StringBuilder("abc"); 24 if(str.length()==0) //字符串為空時不求排列 25 { 26 System.out.println("不能為空"); 27 return; 28 } 29 System.out.println(str+"的全排列如下:"); 30 Test.pailie(str,0,str.length()-1); 31 32 } 33 34 } View Code輸出結果為:
abc的全排列如下:
abc
acb
bac
bca
cba
cab
?
轉載于:https://www.cnblogs.com/guozhenqiang/p/5428901.html
總結
- 上一篇: 数组经典题之杨辉三角变形
- 下一篇: Python正则表达式指南