全排列(遞迴)

2021-08-18 07:46:39 字數 1083 閱讀 7542

給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有』a』 < 『b』 < … < 『y』 < 『z』,而且給定的字串中的字母已經按照從小到大的順序排列。

輸入只有一行,是乙個由不同的小寫字母組成的字串,已知字串的長度在1到6之間。

輸出這個字串的所有排列方式,每行乙個排列。要求字母序比較小的排列在前面。字母序如下定義:

已知s = s1s2…sk , t = t1t2…tk,則s < t 等價於,存在p (1 <= p <= k),使得

s1 = t1, s2 = t2, …, sp - 1 = tp - 1, sp < tp成立。

abcabc

acb

bac

bca

cab

cba本題就是乙個簡單的生成全排列的題目,可以有很多演算法,我用的是遞迴去做,或者看作是全排列組成的樹上的深搜也沒有問題。注意讀入之前先排一下序,因為資料量少就隨手用了選擇排序

#include

#include

#define maxscale 6

void find(char * perm, char * elem, int * mark, int n, int len);

// perm存放排列,elem存放元素,mark標誌是否已經被選入排列,n表示待選擇的元素個數,len是總元素數

void sort(char * elem, int n);

int main()

; scanf("%s", elem);

len = strlen(elem);

sort(elem, len);

find(perm, elem, mark, len, len);

return0;}

void find(char * perm, char * elem, int * mark, int n, int len)

printf("\n");

}for (int i = 0; i < len; i++)

}}void sort(char * elem, int n)}}

}

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

遞迴全排列

遞迴思想,用重複的簡單過程實現乙個複雜的專案,遞迴要素有 1 遞迴的每一層,規模要逐漸縮小 2 遞迴必須有出口,一般每個遞迴函式一開始,是判斷遞迴成立的條件 3 遞迴包括遞進過程和返回過程 4 要注意遞迴實現次數,一般在呼叫遞迴函式前加上遞迴重複條件 常見的結構是 遞迴函式 if 條件成立,例如規模...

全排列遞迴

輸出1 n這n個數的全排列 從遞迴角度去想,把問題分為若干個子問題 輸出以1開頭的全排列 輸出以2開頭的全排列 輸出以n為開頭的全排列 於是不妨設定乙個陣列p,用來存放當前排列,在設定乙個雜湊陣列hashtable,其中hashtable x 當整數x已經在p中時為true。如下 include u...