劍指offer 字串的排列

2021-08-21 13:54:27 字數 1571 閱讀 3885

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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 ...