先對我們要解決的問題進行乙個描述:
如上圖所示,原來有個字串
」123」,
現在有個對應關係,可以把1換成
」a」,
」a」,」甲
」,可以把2換成
」b」,
」b」,可以把3換成
」c」,那麼,有多少種組合字串的方式呢(注意順序不變),我們可以計算得到
4*3*2 = 24
種組合方式(包括原字串
」123」
在內)。我們用
0~23這24
個數字來給所有組合的字串編號,如何根據
0~23這24
個數字,再反過來推出每個數字是對應的哪個字串呢?下面,詳細說一下方法。
根據上面的描述,我們有以下一直條件:
1.1對應的替換字元是
」a」, 「a」, 「甲」
2.字串
」123」
的順序不能改變,也就說,只能替換出來
」a2c」
這樣的字串,不能替換出來
」2ac」
這樣的字串。 3.
對於第一位的字元,
」1」, 「a」, 「a」,」甲」
的順序也是固定的,比如第一位的
index為0
的字元是
」1」,index為1
的字元代表
」a」, index為2
的代表」a」, index為3
的代表字元」甲
」。詳細思路如下:
對於上面這例子,我們可以看成乙個三位數,百位是
1,十位為
2,個位為
3,這三位的進製是不一樣的,例如,十位的進製是
2,百位的進製是
6,為什麼呢,因為對於十位來說,當個位變化兩次之後,十位就會變化一次。舉個具體的例子
對於字串
」123」
的編號就是
0,因為對應的三位數是
000,對於字串
」12c」,
對應的三位數是
001,
所以,字串
」12c」
的編號是1,
字串」1b3」
來說,對應的三位數是
010(不要整個看成二進位制,雖然這個時候看成二進位制也是2)
,因為個位數只有兩個變化(
」3」和
」c」),所以,
010可以看成是
001進製之後的結果,這個時候表示的就是2,
」011」
表示字串
」1bc」,
根據十位是二進位制,所以這個數表示
3,下面,出現規律的情況出現了,
」0b0」,
這個字串對應的三位數是多少呢?是
」020」,
因為十位是
2進製,所以
020就是
2*2為4,
「021」
對應的是
2*2 + 1 =5
,下面我們看看百位的進製是多少,我們知道,到
021為止,已經吧十位和個位的所有組合列舉出來了,編號是
0~5,總共六個數,所以,百位的進製就是
6進製,如下
「100」
à對應字串
」a23」,
編號是6
「101」
à對應的字串是
」a2c」,
編號是7
「110」
à對應的字串是
」ab3」,
編號是8
「111」
à對應的字串是
」abc」,
編號是9
「120」
à對應字串是
」ab3」,
編號是10
「121」
à對應字串是
」abc」,
編號是11
「200」
à對應字串是
」a00」,
編號是12
……「321」
à對應的字串是」甲
bc」,編號是:
3*6 +2*2 + 1*1 = 23
是不是已經看出來規律了,就是三位數,對應的三個進製,百位乘以
6 加上
十位乘以
2 加上
個位乘以
1 的出來的十進位制數字就是這個字串的編號,那麼百位數,十位數,個位數的怎麼填充呢,就是用每位的
index
來填充。
反過來,如何根據編號,得到對應的字串,
比如我們需要取出編號為
19的字串,那麼,我們來看看,怎麼找
我們知道,百位數有四個替換字元,
index
是0~3
,百位的進製是
6進製,
6進製的整數是0(
0乘以6)
,6(1乘以
6),12(2乘以
6),18(3乘以
6),24(
4乘以6,不過這個
case
我們沒有百位數是
4的結果,)我們先設定百位數,再設定十位數,最後設定個位數,因為
19是大於
18的,小於
24,所以,百位數是
3,19-18
還剩下1
,顯然十位數應該設定為
0,因為十位數是要乘以
2的,因此個位數設定為
1,拼出來的三位數就是
301,取出對應的字串就是」甲
2c」這個字串了。
以上就是利用不同為的進製不同,我們用連續的整數編號,來表示每乙個組合的結果的方法,具體的**,以後有時間不上。
用DFS解決組合問題
一直以來,大量做各類管理系統的程式設計師,大量的時間都在處理各類增刪改查問題,對於其他的方面尤其是演算法層面的涉及較少,這次就遇到乙個問題。使用者上傳乙份excel,讓使用者選擇其中的部分列頭,程式對列頭做兩兩組合,並對所有的組合取excel表中的資料,繪製乙個折線圖。檔案上傳。前端使用非同步外掛程...
演算法 遞迴思想解決排列組合問題
演算法 遞迴思想解決排列組合問題 直接上 void astring m char str,char pbegin void astring char str 提供的公共介面函式 void cstring m char pstr,int m,vector result result.push back...
引入進製概念解決排列組合問題
在程式中很多時候都需要進行遍歷資料,當遇到排列組合問題時最常見的解決辦法就是多層迴圈遍歷。但是這中方法在有時好像並不輕鬆。比如求9位1 9數字排列組合的所有解時,要用for迴圈遍歷所有解的話需要寫9層for迴圈。迴圈的此數為9 9.這樣寫起來過於繁瑣,我們可用引入進製的概念進行遍歷。比如1 9共9個...