輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串 abc,則列印出由字元 a, b, c 所能排列出來的所有字串 abc, acb, bac, bca, cab 和 cba。
示例:
輸入:abc
輸出:abc
acbbac
bcacab
cba有要求排序,則需要將字串所有字元取出生成等長的char陣列並進行排序,再根據排序後的結果選擇字元進行組合;
選擇字元的過程可以用遞迴實現,使用for迴圈進行遞迴呼叫也可以滿足字典序進行組合,那麼這個過程中需要有乙個boolean陣列來標誌該字元是否已被使用;
遞迴終止條件設定為當前組合的字串長度等於char陣列的長度;
遞迴體中使用乙個for迴圈,從排好序的char陣列的第一位開始進行遍歷與組合可以保證字典序。首先應該查詢該位是否使用過,已使用則跳過該字元去遍歷下乙個字元,未使用則更新使用狀態為使用(true),然後將該字元加入組合的串中,接著遞迴呼叫。待遞迴返回後,從串中刪除該字元,將使用狀態更新為未使用(false),達到回溯。
private arraylist
ret =
newarraylist
<
>()
;public arraylist
solute
(string str)
char
chars = str.
tochararray()
; arrays.
sort
(chars)
;back
(chars,
newboolean
[chars.length]
,new
stringbuilder()
);return ret;
}//hasused儲存對應位置的字元使用情況,s儲存當前組合方案
private
void
back
(char
chars,
boolean
hasused,stringbuilder s)
//for迴圈保證按照字典序遍歷組合
for(
int i=
0;i)}
劍指Offer 38 字串的排列
輸入乙個字串,列印出該字串中字元的所有排列。例 輸入 abc 輸出 abc acb bac cab cba 長度為n的字串的排列若是集合s,其中一種排列的字串為 s2,sn s2 sn 再插入sn 1s sn 1 則有對於乙個字串有n 1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全...
劍指Offer 題38(字串的排列)
輸入乙個字串,列印出該字串中字元的所有排列。輸入 abc 輸出 abc acb bac bca cab cba。step1 求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有字元進行交換。step2 每次都把乙個數固定在前面,讓後面的數遞迴地進行全排列,這樣每個數都固定過以後就能找出所有排列...
劍指 Offer 38 字串的排列
輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba class solution boolean visited new boolean s.length dfs s,vis...