題目描述:
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。
解題思路:
對於這個問題,我們同樣可以采用分解的辦法。要求整個字符串的排列,可以看成兩步:第一步:求所有可能出現在第一個位置的字符,即把第一個字符與后面的字符依次交換。第二步:固定一個字符,求后面所有字符的排列。
很明顯,求后面所有字符的排列,我們仍然可以把所有的字符分成兩個部分:后面的字符的第一個字符以及這個字符之后的所有字符,然后把第一個字符逐一與其后的字符交換。因此,這是典型的遞歸思路。
舉例:

編程實現(Java):
import java.util.*;
public class Solution {
ArrayList<String> res=new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if(str==null||str.length()==0)
return res;
Permutation(str.toCharArray(),0);
Collections.sort(res);
return res;
}
public void Permutation(char[] strArr,int begin){
if(begin==strArr.length-1){
String s=String.valueOf(strArr);
if(!res.contains(s))
res.add(s);
}else{
for(int i=begin;i<strArr.length;i++){ //依次將后面的與begin交換
swap(strArr,begin,i);
Permutation(strArr,begin+1);
swap(strArr,begin,i);
}
}
}
public void swap(char[] strArr,int a,int b){
char temp=strArr[a];
strArr[a]=strArr[b];
strArr[b]=temp;
}
}