全排列 方法 全排列函式和遞迴和字典序

2021-08-20 13:41:15 字數 1591 閱讀 4906

給你乙個字串,按字典序從小到大輸出這個字串的全排列

乙個由小寫字母組成的長度小於等於8的不含重複字元的字串

按字典序從小到大輸出這個字串的全排列

abc
abc

acbbac

bcacab

cba

next_permutation函式

組合數學中經常用到排列,這裡介紹乙個計算序列全排列的函式:

next_permutation(start,end),和prev_permutation(start,end)。這兩個函式作用是一樣的,區別就在於前者求的是當前排列的下乙個排列,後乙個求的是當前排列的上乙個排列。至於這裡的「前乙個」和「後乙個」,我們可以把它理解為序列的字典序的前後,嚴格來講,就是對於當前序列pn,他的下乙個序列pn+1滿足:不存在另外的序列pm,使pn

對於next_permutation函式,

其函式原型為:

#include

bool next_permutation(iterator start,iterator end)

當當前序列不存在下乙個排列時,函式返回false,否則返回true

next_permutation(num,num+n)函式是對陣列num中的前n個元素進行全排列,同時並改變num陣列的值。

另外,需要強調的是,next_permutation()在使用前需要對欲排列陣列按公升序排序,否則只能找出該序列之後的全排列數。

此外,next_permutation(node,node+n,cmp)可以對結構體num按照自定義的排序方式cmp進行排序。

應用舉例:

#include #include using namespace std;  

int main()

; do

void quanpailie(char array,int len,int index)

2.字典序

解題思路

設p是1~n的乙個全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn

1)從排列的右端開始,找出第乙個比右邊數字小的數字的序號j(j從左端開始計算),即 j=max(右邊的數從右至左是遞增的,因此k是所有大於pj的數字中序號最大者)

3)對換pi,pk

4)再將pj+1......pk-1pkpk+1......pn倒轉得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下乙個排列。

證明

演算法步驟1,得到的子串 s = , 是按照從大到小進行排列的。即有 pj+1 > pj+2 > ... > pn, 因為 j=max

void reverse(char *s, int first, int last)

} cout

swap(a,j,i);

reverse(a,j+1,length-1);

cout<

} return 0;

}

全排列和去重全排列 遞迴實現

一 全排列的概念 根據360百科,我們知道從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。二 全排列的演算法 三 接下來我們學習第一種方法 遞迴實現全排列 include include using nam...

46 全排列 全排列 遞迴

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

全排列 遞迴方法

與網路上大多數方法相比,該方法可以處理 1 1 1 重複生成的問題 c採用set include include include using namespace std int n 0 vector con set res void resprint void swap int a,int b vo...