全排列的遞迴和非遞迴實現

2021-09-25 16:17:44 字數 1946 閱讀 8273

1.全排列的遞迴實現

全排列就是從第乙個數字起每個數分別與它後面的數字交換

#include

#include

#include

using

namespace std;

//遞迴實現

void

allrange

(string s,

int k,

int m)

else}}

intmain()

執行結果:

第1個排列是:abc

第2個排列是:acb

第3個排列是:bac

第4個排列是:bca

第5個排列是:cba

第6個排列是:cab

但是這沒有考慮到序列中重複的情況

第1個排列是:abb

第2個排列是:abb //重複

第3個排列是:bab

第4個排列是:bba

第5個排列是:bba //重複

第6個排列是:bab //重複

2.去重的全排列的遞迴實現

去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換

#include

#include

#include

using

namespace std;

bool

needswap

(string s,

int k,

int m)

//遞迴實現

void

allrange

(string s,

int k,

int m)

else}}

intmain()

執行結果:

第1個排列是:abb

第2個排列是:bab

第3個排列是:bba

3.全排列的非遞迴實現

要考慮全排列的非遞迴實現,先來考慮如何計算字串的下乙個排列。如"1234"的下乙個排列就是"1243"。只要對字串反覆求出下乙個排列,全排列的也就迎刃而解了。

如何計算字串的下乙個排列了?來考慮"926520"這個字串,我們從後向前找第一雙相鄰的遞增數字,「20」、"52"都是非遞增的,「26 「即滿足要求,稱前乙個數字2為替換數,替換數的下標稱為替換點,再從後面找乙個比替換數大的最小數(這個數必然存在),0、2都不行,5可以,將5和2交換得到"956220」,然後再將替換點後的字串"6220"顛倒即得到"950226」。

對於像"4321"這種已經是最「大」的排列,採用stl中的處理方法,將字串整個顛倒得到最「小」的排列"1234"並返回false。

#include

#include

#include

using

namespace std;

bool

nextarrangement

(string &s)}if

(index ==-1

)return

false

;for

(int i = s.

length()

-1; i > index; i--)}

return

true;}

intmain()

while

(nextarrangement

(s))

;return0;

}

執行結果:

第1個排列是:abc

第2個排列是:acb

第3個排列是:bac

第4個排列是:bca

第5個排列是:cab

第6個排列是:cba

全排列的遞迴和非遞迴的實現

用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba 為方便起見,用123來示例下。123的全排列有123 132 213 231 312 321這六種。首先考慮213和321這二個數是如何得出的。...

非遞迴全排列實現

include include include include include include include includeusing namespace std const int max size 1000 尋找下乙個排列 假設 某個序列為 d1 d2 d3 dn 那麼在dn前找第乙個 比dn...

非遞迴實現全排列

要求 使用非遞迴的方法按照字典序輸出全排列 思路 這次以 1 5 4 3 2 為例,下乙個排列是 2 1 3 4 5 從後往前找,找到第乙個連續遞增的兩個數字,找到了 1 5 重新從後往前找,找到第乙個大於 1 的數字,找到了 2 1 就是步驟三中找到的第乙個數字 找到 2 之後,將 1 和 2 互...