字串的排序(全排序)

2021-10-05 07:49:58 字數 1796 閱讀 2591

《劍指offer》中題38

輸入乙個字串,列印出該字串中字元的所有排列。

例如,輸入字串abc,則列印出由字元a、 b、c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

遞迴過程:

1. 從起始位置往後迴圈,起始位置的字元和後面字元對換;

2. 遞迴該過程;

3. 起始位置的字元和後面字元對換回來。

遞迴退出條件:起始的字元為空,結束遞迴。

全排序佇列實現《二叉搜尋樹序列——5.2用佇列實現的全排序 》:

遞迴要有出口避免出現死迴圈。在實際開發過程中迴圈、遞迴、間接遞迴,如果沒有非常明顯的出口,我一般會定義迴圈次數上限,到達上限還沒有推出列印日誌並強行退出,避免出現死迴圈。死迴圈一旦出現就是事故了,得需要萬分注意。

// **** 

#include void permutation(char* pstr, char* pbegin);

void permutation(char* pstr)

void permutation(char* pstr, char* pbegin)

else

}}// ********************測試**********************

void test(char* pstr)

int main(int argc, char* ar**)

執行結果:

上面是《劍指offer》中的**,發現並未去重處理,修改測試用例測試一下。

測試用例**:

int main(int argc, char* ar**)

執行結果:

發現有大量重複結果,重複字串不列印方法,在【三、思路 】【遞迴過程】中迴圈的字串若之前已經出現過該字元就跳過該字元,繼續下乙個迴圈

#include void permutation(char* pstr, char* pbegin);

void permutation(char* pstr)

void permutation(char* pstr, char* pbegin)

else

; // 用於記錄已經出現的字元,字元出現一次之後對於值改為1

for(char* pch = pbegin; *pch != '\0'; ++ pch)

++chcheck[*pch];

char temp = *pch;

*pch = *pbegin;

*pbegin = temp;

permutation(pstr, pbegin + 1);

temp = *pch;

*pch = *pbegin;

*pbegin = temp;}}

}// ********************測試**********************

void test(char* pstr)

int main(int argc, char* ar**)

執行結果:

字串 全排序

給定乙個字串陣列,列印這個陣列所有的排序組合。利用遞迴,把每個字串放在開頭n,然後分別得到相應的組合個數m,最後sum s m。public class stringfullarray public static void arrange string str,int start,int lengt...

C 字串全排序

排列 從n個元素中任取m個元素,並按照一定的順序進行排列,稱為排列 全排列 當n m時,稱為全排列 比如 集合的全排列為 我們可以將這個排列問題畫成圖形表示,即排列列舉樹,比如下圖為的排列列舉樹,此樹和我們這裡介紹的演算法完全一致 演算法思路 1 n個元素的全排列 n 1個元素的全排列 另乙個元素作...

經典題目 字串全排序

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入 每個測試案例包括1行。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。輸出 對應每組資料,按字典序輸...