51nod-1384-全排列
文章目录
https://www.51nod.com/Challenge/Problem.html#!#problemId=1384
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,
字典序法
设P是集合{1,2,……n-1,n}的一个全排列:P=P1P2……Pj-1PjPj+1……Pn(1≤P1,P2,……,Pn≤n-1)
从排列的右端开始,找出第一个比右边数字小的数字的序号j,即> j=max{i|Pi<Pi+1,i>j}
在Pj的右边的数字中,找出所有比Pj大的数字中最小的数字Pk,即k=min{i|Pi>Pj,i>j}
交换Pi,Pk
再将排列右端的递减部分Pj+1Pj+2……Pn倒转,因为j右端的数字是降序,所以只需要其左边和右边的交换,直到中间,因此可以得到一个新的排列P’=P1P2……Pj-1PkPn……Pj+2Pj+1。
1 | char str[10]; |