題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。
輸入描述:輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。
思路:將字符串abcdefg分成倆部分,a和bcdefg,然後將a和bcdefg各位不停的交換。bcdefg則繼續進行相同的操作。最後進行一下排序。
public class Title28 {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<String>();
if(str == null || str.length() == 0)
return result;
char[] s = str.toCharArray();
rank(result,s,0);
Collections.sort(result);
return result;
}
public void rank(ArrayList<String> result,char[] s,int begin){
// 如果到結尾了,加入到結果集。
if(begin == s.length -1){
result.add(new String(s));
return ;
}
for(int i=begin;i<s.length;i++){
if(i != begin){
// 如果值相等,則不用交換
if(s[i] == s[begin])
continue;
swap(s,i,begin);
rank(result,s,begin+1);
swap(s,i,begin);
}else{
rank(result,s,begin+1);
}
}
}
public void swap(char[] s,int posA,int posB){
if(posA == posB)
return ;
char temp = s[posA];
s[posA] = s[posB];
s[posB] = temp;
}
/**
* 測試
*/
public static void main(String[] args) {
ArrayList<String> result = new Title28().Permutation("aabc");
System.out.println(result);
// [aabc, aacb, abac, abca, acab, acba, baac, baca, bcaa, caab, caba, cbaa]
result = new Title28().Permutation("aba");
System.out.println(result); // [aab, aba, baa]
}
}