字串的排列(劍指offer 面試題38)

2021-09-11 01:44:53 字數 914 閱讀 8917

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
該題利用遞迴的思想解決;首先將字串str分為兩部分:第乙個字元和剩下所有字元;然後將第乙個字元與剩餘字元的每一給字元交換位置,每一次交換位置後,都固定第乙個字元,遞迴地(按照上述思想繼續進行)對剩餘字元進行排列。

1)每次交換了第乙個位置遞迴呼叫之後,得將第乙個位置的元素交換回來,這樣才能使排列無重複的進行。

2)因為題目中說明了元素可能重複,所以交換位置前必須檢查兩個交換元素是否相等,相等則不交換,跳過此次迴圈,否則出現重複排列。

3)我利用sort函式將 vectorresult從小到大排序後,才通過了測試,因為排列本身沒有問題,只是出現的順序沒能按照字串增序出現。

#include

class solution

void strpermutation(string str,int strlen, int startloc, vector&result)

for(int i = startloc; i startloc && str[i] == str[startloc])

continue;

char temp = str[i];

str[i] = str[startloc];

str[startloc] = temp;

strpermutation(str,strlen,startloc+1,result);

temp = str[i];

str[i] = str[startloc];

str[startloc] = temp;}}

};

劍指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 ...