《劍指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 可能有字元重複 字元只包括大小寫字母。輸出 對應每組資料,按字典序輸...