輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
首先確定第乙個字母,這種情況下的排列就是剩下字元的所有排列,可以用遞迴完成,然後依次交換第乙個字母和剩下的字母,得到不同起始字母下的所有排列。思路聽起來很簡單,但是有很多需要注意的點。
首先不需要單獨用變數儲存每個排列,直接在str上進行交換操作,然後把字串一次壓入result,所以要注意每次交換計算完所有排列後,要再交換回來,不然會有重複。
其次用乙個變數start表示當前遞迴過程第乙個字母,所以每次遞迴要將start+1(即先確定start位置的字母,然後遞迴後面的字串),遞迴的結束條件時start到達最後乙個字元,即不需要再交換了。
用迴圈來實現首字母與剩下字母交換,因為原始字串也是乙個排列,所以交換的位置i從start開始;因為可能有重複的字元,所以當i!=start,並且i和start位置的字元相同時,要跳過這些重複字元,直接i++。
最後得到的所有排列要做乙個排序,保證按字典序輸出。
ac**:
class solution
void permutation(string str, int start, vector&result)
for(int i=start; i}
};
劍指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 ...