劍指 字串全排列

2021-07-10 18:24:38 字數 1338 閱讀 4162

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

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
思路:遞迴法,問題轉換為先固定第乙個字元,求剩餘字元的排列;求剩餘字元排列時跟原問題一樣。

(1)遍歷出所有可能出現在第乙個位置的字元(即:依次將第乙個字元同後面所有字元交換);

(2)固定第乙個字元,求後面字元的排列(即:在第1步的遍歷過程中,插入遞迴進行實現)。

需要注意的幾點:

(1) 先確定遞迴結束的條件,例如本題中可設begin == str.size() - 1; 

(2) 形如abaaa等特殊測試用例的情況,vector在進行push_back時是不考慮重複情況的,需要自行控制;

(3) 輸出的排列可能不是按字典順序排列的,可能導致無法完全通過測試用例,考慮輸出前排序,或者遞迴之後取消復位操作。

class solution 

void showall(string str, vector& result, int index)

}else

void permute( char *pstr, char *pbegin);

void permute( char *pstr)

void permute( char *pstr, char *pbegin) else }}

int main()

例如:輸入"abb",輸出結果為abb, bab, bba。

去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換。

例如:「abb」,第乙個字元a和第二個字元b交換,得到「bab」,此時由於第二個字元和第三個字元相同,所有第乙個字元「a」不與第三個字元「b「交換。再考慮,」bab「,第二個字元和第三個字元不同,交換得」bba「,此時結束。生成全部排列

加乙個判斷,滿足條件再進行交換

//在[nbegin,nend)區間中是否有字元與下標為pend的字元相等  

boolisswap(char* pbegin,char* pend)  

returntrue;  

劍指offer 字串全排列

題目 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。思路 元素排列是遞迴問題,在某個位置上選擇哪個元素就對應著該位置上的元素與其他元素相交換 不要忘了與自己交換的情況 所以按照排列...

劍指offer 字串的全排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。注意有可能重複,因此需要判斷def swap s...

劍指Offer之字串全排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素 輸入 s abc 輸出 abc acb bac bca cab cba class solution for int j i j變形二 列印字串的所有子串行 public class demo2...