全排列算法的字典序排列
生活随笔
收集整理的這篇文章主要介紹了
全排列算法的字典序排列
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
字典序排列就是按照字典a-z,1-9的順序給出字符串的順序全排列,例如abc的全排列就是從abc一直排到cba。那么給定一個字符串,怎么找出恰好大于該字符串的下一個排列呢?
我們考慮如下的步驟:
1、假設(shè)字符串為p1p2….pn,我們從后往前尋找第一個符合pj<pj+1條件的字符pj,也就是說,p1p2…pj-1pjpj+1…pn中pj<pj+1并且pj+1>pj+2>…pn。
2、再次從后往前尋找第一個大于pj的字符pk,也就是說,p1p2pj-1pjpj+1…pk-1pkpk+1…pn中從后往前pk>pj并且pk+1,…pn<pj,可以看出pk也是比pj大的數(shù)中最小的一個,因為最差情況下k=j+1。
3、交換pj和pk,這樣在p1p2…pj前j個字符變大了,pj放到原來pk的位置上同樣符合pj+1>…pk-1>pj>pk+1…>pn。
4、為了得到恰好大于該字符串的下一個排列,我們看到從j+1之后的字符串是降序排列的,我們將其翻轉(zhuǎn),就可以得到想要的結(jié)果了。
那么什么時候整個過程結(jié)束呢?當再也找不到符合條件的j時,說明當前的字符串已經(jīng)是逆序的了,也就是字典序最大。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | void?Permutation(char* str) { ????if(!str) ????????return; ????int?len=strlen(str); ????while(true) ????{ ????????cout <<str<<endl; ????????int?j=len-2,k=len-1; ????????while(j>=0 && str[j]>str[j+1]) ????????????--j; ????????if(j<0) ????????????break; ????????while(str[k]<str[j]) ????????????--k; ????????? ????????char?temp=str[k]; ????????str[k]=str[j]; ????????str[j]=temp; ????????int?a,b; ????????for(a=j+1,b=len-1;a<b;++a,--b) ????????{ ????????????temp=str[a]; ????????????str[a]=str[b]; ????????????str[b]=temp; ????????} ????} } |
按照這個思路還可以有另一道題目,將abcdef的所有的排列,按照其字典序排列,求其第49個排列 以ab開頭的字符串有4*3*2 = 24, 也是字典序中的前24種 以ac開頭的字符串有 24種,這是接下來的24種 現(xiàn)在已經(jīng)到達第48種 所以第49就是adbcef
總結(jié)
以上是生活随笔為你收集整理的全排列算法的字典序排列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java垃圾回收之循环引用
- 下一篇: auto_ptr的简单实现