輸入一個字串,按字典序打印出該字串中字元的所有排列(劍指offer)
阿新 • • 發佈:2018-12-08
題目
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
簡單解釋下什麼是字典序,簡單理解就是像英文字典那樣排序,
設想一本英語字典裡的單詞,何者在前何者在後?
顯然的做法是先按照第一個字母、以 a、b、c……z 的順序排列;如果第一個字母一樣,那麼比較第二個、第三個乃至後面的字母。如果比到最後兩個單詞不一樣長(比如,sigh 和 sight),那麼把短者排在前。
分析:基於回溯法思想
這裡要注意,上面的順序最後的CBA與CAB最後要再排序一次!!!
程式碼如下:
public class Permutation {
public ArrayList<String> permutation(String str) {
ArrayList<String> res = new ArrayList<String>();
if(str != null && str.length() > 0){
process(str.toCharArray(), 0, res);
Collections.sort(res);//最後的排序,以保證為字典序
}
return res;
}
public void process(char[] str,int i,ArrayList<String> list){
if(i == str.length-1){
String val = String.valueOf(str);
if(!list.contains(val)){
list.add(val);
}
}else{
for(int j=i; j<str.length; j++){
swap(str,i,j);
process(str, i+1, list);
swap(str, i,j);
}
}
}
public void swap(char[] str,int i,int j){
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}