日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全排列算法的字典序排列

發(fā)布時間:2024/9/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全排列算法的字典序排列 小編覺得挺不錯的,現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。