演算法學習之字串全排列

2021-07-10 02:10:04 字數 1104 閱讀 9547

第一種方法字串全排列,思想上和我們高中學的排列一樣,比如123,開始的時候第乙個位置有三種選擇,第乙個選完之後第二個位置就只剩下兩種選擇,第三個位置,就剩一種,所以一共有n!種排列,所以我們可以用遞迴的思想去做,遞迴中做交換

#include #include #define max  50

void swap(char *a,char *b)

void permutations(char *str,int pos,int n) //pos表示當前位置,n表示字串的大小

else

}}int main()

第二種方法,使用字典序全排列,字典序就是按照從小到大的情況排列,比如有三位數123我們假設是百位 十位 個位

則按照字典序排列的話,輸出順序為 123 132  213 231 312 321 ,也就是說,當前數的下乙個數必須比它大,並且和它距離最短,這就是字典序排列。

演算法描述:1.先將陣列從小到大排序

2.從後往前掃瞄,找到ai

3.從後往前掃瞄,找到第乙個大於ai的數,比如ak

4.交換ai和ak 此時i+1到n排列是從大到小,所以要逆至,變成從小到大

5.將ai+1以後的數全部逆置,是為了讓,變化後的數和上乙個距離最短,把越大的數,放的越後,則變化範圍最小,也就是二者想減,值最小

6.重複,2 3 4 5步驟,直到變成最大那個數為止

#include #include #define max  50

void reverse(char *str,int i)

}int permutations(char *str,int n)

if(i == -1)

return 0;

for(j = n; j >=0 && str[j] <= str[i]; j--) //找到最右邊大於ai的數

char tmp = str[i];//交換i,j

str[i] = str[j];

str[j] = tmp;

reverse(str,i+1);//逆至i後面的數

return 1;

}int main()

演算法 字串之全排列

字串的全排列是字串類的演算法題的乙個考察點,屬於普通問題,它有兩種實現方法,遞迴演算法和非遞迴演算法,非遞迴的方法要稍微難一點,以下會依次進行介紹。演算法思想 求n位的字串的全排列,先確定第0位,然後對後面n 1位進行全排列,在對n 1為進行全排列時,先確定第1位,然後對後面的n 2位進行全排列.由...

字串全排列演算法

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba 這是典型的遞迴求解問題,遞迴演算法有四個特性 對於字串的排列問題 如果能生成n 1個元素的全排列,就能生成n個元素的全排列。對於只有乙個元素的集...

演算法 字串全排列演算法

最近在牛客和領扣上刷題,碰到了一些全排列的問題,總結一下。我們首先來看乙個問題?題目 字串的排列 題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。解題思路 使用遞迴的方式來...