1. 程式人生 > 實用技巧 >字串的排列(劍指offer-27)

字串的排列(劍指offer-27)

題目描述

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

題目解析


首先確定一個初始位置,然後通過遞迴去查詢每一個位置的字元可能出現情況。比如說現在要找index下標位置的字元,那麼體現在程式碼中就是交換index以及index位置之後的那些字元。

題目解答

import java.util.*;
public class StringSort {
    public ArrayList<String> Permutation(String str) {
        char[] a = str.toCharArray();
        ArrayList<String> ans = new ArrayList<>();
        solve(ans,a,0,str.length());
        ans = new ArrayList<String>(new HashSet<String>(ans));//去重
        Collections.sort(ans);//字典排序 -> ans.sort(null);
        return ans;
    }

    private void solve(ArrayList<String> ans, char[] a, int index, int length) {//進行全排列
        if (index == length-1){//當前位置在字串的最後
            String res = change(a);//將char轉換成String型別的函式
            ans.add(res);
        }
        else{//現在要確定index位置的字元,將index與index以後的字元進行交換
            for (int i = index; i < length; i++) {
                char tmp = a[i];
                a[i] = a[index];
                a[index] = tmp;
                //當前index位置的字元已經通過交換找到,遞迴尋找下一個位置的字元
                solve(ans,a,index+1,length);
                //為了消除當前層去遞迴的時候的進行交換字元的影響,
                //如果不消除的話,那麼就會造成原index位置的字元發生變化
                tmp = a[i];
                a[i] = a[index];
                a[index] = tmp;
            }
        }
    }

    private String change(char[] a) {//將char轉換成String型別的函式
        StringBuilder res = new StringBuilder();
        for (char value:a
             ) {
                res.append(value
                );
        }
        return res.toString();

    }
}