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
2.去重的全排列的遞迴實現第1個排列是:abb
第2個排列是:abb //重複
第3個排列是:bab
第4個排列是:bba
第5個排列是:bba //重複
第6個排列是:bab //重複
去重的全排列就是從第乙個數字起每個數分別與它後面非重複出現的數字交換
執行結果:#include
#include
#include
using
namespace std;
bool
needswap
(string s,
int k,
int m)
//遞迴實現
void
allrange
(string s,
int k,
int m)
else}}
intmain()
3.全排列的非遞迴實現第1個排列是:abb
第2個排列是:bab
第3個排列是:bba
要考慮全排列的非遞迴實現,先來考慮如何計算字串的下乙個排列。如"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 互...