輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
書上的要求是
(1)不要求按字典順序
(2)可能存在重複的字串排列
固定要排序部分的第乙個字元(從該字元到最後乙個字元,都可以和第乙個字元交換位置,交換完固定第乙個字元。也就是讓任何字元都有可能出現在第乙個位置),後面的字元再全排列。
}//一次完整的列印是這樣的,首先sourcestr、changestr都指向"abc",接著swap第乙個,結果還是"abc"
} int main(void)
後面的swap是,遞迴呼叫swap交換前後兩個字元,在最後交換完成入list之後再交換回來,回到初始狀態再進下乙個迴圈。
在ide上設定斷點,單步除錯,對照前面的樹圖理解。
後去重(遍歷時沒有考慮相同字元的交換問題)
void permutation( string &pbegin, int n, vector&res)//n為下標值
}}vectorpermutation(string pstr)
void main()
先去重(交換時遇到重複的字元跳過,不交換)
這裡一次迴圈結束的條件是begin位於最後乙個位置,可以直接輸出字串了,因為只有一種可能。不必讓begin == size時結束。
#include #include #include #include using namespace std;
class solution
void permutation(vector&array, string str, int begin)//遍歷第begin位的所有可能性
for(int i=begin;i
swap(str[i],str[begin]);
//當i==begin時,也要遍歷其後面的所有字元
//當i!=begin時,先交換,使第begin位取到不同的可能字元,再遍歷後面的字元
permutation(array,str,begin+1);
swap(str[i],str[begin]);//為了防止重複的情況,還需要將begin處的元素重新換回來}}
};
劍指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 ...