1. 程式人生 > >輸入一個字串,按字典序打印出該字串中字元的所有排列(劍指offer)

輸入一個字串,按字典序打印出該字串中字元的所有排列(劍指offer)

題目

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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; } }