字串的排列(劍指offer-27)
阿新 • • 發佈:2020-07-06
題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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(); } }