給你乙個字串,按字典序從小到大輸出這個字串的全排列
乙個由小寫字母組成的長度小於等於8的不含重複字元的字串
按字典序從小到大輸出這個字串的全排列
abc
abcnext_permutation函式acbbac
bcacab
cba
組合數學中經常用到排列,這裡介紹乙個計算序列全排列的函式:
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進行排序。
應用舉例:
2.字典序#include #include using namespace std;
int main()
; do
void quanpailie(char array,int len,int index)
解題思路
設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...