【Java】 劍指offer(38) 字符串的排列

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目 

  輸入一個字符串,打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a、b、c所能排列出來的全部字符串abc、acb、bac、bca、cab和cba。(本文代碼採用ArrayList<String>接收返回的字符串,並要求不出現重複字符串)數組

思路

  將字符串當作兩部分,一部分是第一個字符,另外一部分是後面的全部字符。post

  首先肯定第一個字符,該字符能夠是字符串中的任意一個;固定第一個字符後,求出後面全部字符的排列(相同步驟,採用遞歸)。測試

  實現第一個字符的改變,只須要將第一個字符和後面全部字符進行交換便可(最先本身想的是從原始字符串拿出第i個字符,而後合併剩下的字符到後面,其實就是個交換的過程,本身開始時想得太複雜了)。要記得字符串輸出後要將字符交換回來,變回原始的字符串。ui

測試算例 url

  1.功能測試(有多個重複字母的字符串、全部字符相同的字符串、一個字符或者多個字符的普通字符串)spa

  2.特殊測試(字符串爲null、「」)htm

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類。blog

  2.list.contains()方法能夠直接判斷是否有重複字符串;Collections.sort(list)能夠將list中的字符串進行排序。

  3.字符串和字符數組間的轉化:str.toCharArray()     String.valueOf(strArray)

  4.數組在遞歸過程當中進行了交換後,最終要記得交換回來(代碼最後幾行)

 

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索