本文參考自《劍指offer》一書,代碼采用Java語言。
題目
輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a、b、c所能排列出來的所有字符串abc、acb、bac、bca、cab和cba。(本文代碼采用ArrayList<String>接收返回的字符串,並要求不出現重復字符串)
思路
將字符串看成兩部分,一部分是第一個字符,另一部分是后面的所有字符。
首先確定第一個字符,該字符可以是字符串中的任意一個;固定第一個字符后,求出后面所有字符的排列(相同步驟,采用遞歸)。
實現第一個字符的改變,只需要將第一個字符和后面所有字符進行交換即可(最早自己想的是從原始字符串拿出第i個字符,然后合並剩下的字符到后面,其實就是個交換的過程,自己開始時想得太復雜了)。要記得字符串輸出后要將字符交換回來,變回原始的字符串。
測試算例
1.功能測試(有多個重復字母的字符串、所有字符相同的字符串、一個字符或者多個字符的普通字符串)
2.特殊測試(字符串為null、“”)
Java代碼
//題目:輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,
//則打印出由字符a、b、c所能排列出來的所有字符串abc、acb、bac、bca、cab和cba。
public class StringPermutation {
public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<String>();
if(str==null || str.length()==0)
return list;
permutationCore(str.toCharArray(),0,list);
Collections.sort(list); //將list中的字符串排序
return list;
}
private void permutationCore(char[] strArray,int index,ArrayList<String> list){
if(index==strArray.length-1){
if(!list.contains(String.valueOf(strArray))) //判斷是否有重復字符串
list.add(String.valueOf(strArray));
}else{
for(int i=index;i<strArray.length;i++){
char temp=strArray[index];
strArray[index]=strArray[i];
strArray[i]=temp;
permutationCore(strArray,index+1,list);
strArray[i]=strArray[index];
strArray[index]=temp;
}
}
}
}
收獲
1.要對字符串進行修改,可以將字符串轉化為字符數組進行修改,也可以考慮使用StringBuilder類。
2.list.contains()方法可以直接判斷是否有重復字符串;Collections.sort(list)可以將list中的字符串進行排序。
3.字符串和字符數組間的轉化:str.toCharArray() String.valueOf(strArray)
4.數組在遞歸過程中進行了交換后,最終要記得交換回來(代碼最后幾行)
