題目要求:輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。
可以通過決策樹來解決這個問題,決策列表提供可選擇字元,分支代表不同的選擇,子節點代表選擇結果。而樹的實現則是迴圈加遞迴。
for(int i=level;i在這個迴圈裡,i代表的就是選擇列表,swap代表的就是當前節點做出的選擇,dfs代表的是該節點的子樹。 swap(s[level],s[i]);代表的是撤銷當前選擇,為的是第二個節點做選擇的時候不受第乙個節點的影響。
此外,為了避免重複字元的影響,這樣採用了set函式,而不是vector來儲存結果。不同於vector的陣列,set的底層實現是紅黑樹,不允許重複元素,也不支援隨機迭代器,使用的是雙向迭代器。和map不同的是,set的key和value相同。
void
dfs(set
&in,string &s,
int level)
for(
int i=level;i++i)
}
vector
permutation
(string str));
}
劍指Offer 字串排列
題目描述 輸入乙個字串,列印出該字串中字元的所有排列。解析 step 1 求所有可能出現第乙個位置的字元。把第乙個字元與後面的每個字元交換。step 2 固定第乙個字元,將後面的字元利用遞迴進行全排列。include include using namespace std void stringpe...
劍指offer 字串的排列
題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c 所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。解題思路 深度搜尋,在每層搜尋裡設定乙個a陣列對映所有字元,每個字元在這層迴圈中只能使用一次,避免重...
劍指offer 字串的排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。分析 經典問題。記住吧。class ...