全排列算法

题目:给定元素a,b,a,b,c,c,d,求解出所有的排列。
思路:首先这道题的算法是一个比较经典的算法,它并不是使用分治法思想,也不是使用动态规范的思想,当然更不是贪心的思想。他采用的是穷举法(当然你也可以称之为强力法)!!!之所以强调这个特点,是想提醒自己,对于涉及到数学的概念的题目,往往需要采用强力法,即便使用计算机的思想也不能从根本上降低算法复杂度,除非问题本身存在一个优化的数学解法,比如最大公因子求法,这就是使用辗转相除的方式。
对于本题而言,我们有个数学概念可以改良算法,但是,这个算法并没有本质上降低算法的复杂度,所以,我们还是采用传统的计算机的方法求解全排列。我门借用动态规划思想的备忘录方法进行求解。说到备忘录我想大家就会想到递归,我们就是采用这种递归求解的思想。

代码如下:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void AllPermutation(vector<char> & vecElementSet, int s, int e, vector<string> & vecAllPermutation)
{
    if (s == e) {
        vecAllPermutation.push_back(string(vecElementSet.begin(), vecElementSet.end()));
        return ;
    }

    AllPermutation(vecElementSet, s+1, e, vecAllPermutation);
    for (int i=s+1; i<e; ++i) {
        if (vecElementSet[i-1] == vecElementSet[i]) continue;

        for (int j=s; j<= (s+i) / 2; ++j) {
            swap(vecElementSet[j], vecElementSet[s+i-j]);
        }
        AllPermutation(vecElementSet, s+1, e, vecAllPermutation);
        for (int j=s; j<= (s+i) / 2; ++j) {
            swap(vecElementSet[j], vecElementSet[s+i-j]);
        }
    }
}

vector<string> AllPermutation(vector<char> vecElementSet)
{
    string strPermutation;
    vector<string> vecAllPermutation;

    sort(vecElementSet.begin(), vecElementSet.end());

    AllPermutation(vecElementSet, 0, vecElementSet.size(), vecAllPermutation);

    return vecAllPermutation;
}

int main(int argc, char ** argv)
{
    vector<char> vecElementSet = {
            'a', 'b', 'a', 'b', 'c', 'c', 'd'
    };

    auto vecAllPermutation = AllPermutation(vecElementSet);

    for (auto itr=vecAllPermutation.begin(); itr!=vecAllPermutation.end(); ++itr) {
        cout << *itr << endl;
    }

    cout << vecAllPermutation.size() << endl;

//    sort(vecAllPermutation.begin(), vecAllPermutation.end());
//    vecAllPermutation.erase(unique(vecAllPermutation.begin(), vecAllPermutation.end()), vecAllPermutation.end());
//    cout << vecAllPermutation.size() << endl;
//
    return 0;
}

该算法对于交换部分是重点,这部分保证了原来重复的元素依然保持连续重复,只有保证了这点,算法才能有效的使用continue的条件。去重复的根本是去掉所有的重复交换!!!(这是参考字典序的算法改进的,该算法的效率不是很高,但是没有更好的办法了)

其实,挺感慨的,学了这么多年的计算机,到头来还是要学习一些数学基本功,但是这些基本功早就还给老师,真的很惭愧,现在连一个高中的排列组合题都不会做了!!!真心不知道自己能在这条路上走多远。

输出:

aabbccd
aabbcdc
aabbdcc
aabcbcd
aabcbdc
aabccbd
aabccdb
aabcdcb
aabcdbc
aabdccb
aabdcbc
aabdbcc
aacbbcd
aacbbdc
aacbcbd
aacbcdb
aacbdcb
aacbdbc
aaccbbd
aaccbdb
aaccdbb
aacdcbb
aacdbcb
aacdbbc
aadccbb
aadcbcb
aadcbbc
aadbccb
aadbcbc
aadbbcc
ababccd
ababcdc
ababdcc
abacbcd
abacbdc
abaccbd
abaccdb
abacdcb
abacdbc
abadccb
abadcbc
abadbcc
abbaccd
abbacdc
abbadcc
abbcacd
abbcadc
abbccad
abbccda
abbcdca
abbcdac
abbdcca
abbdcac
abbdacc
abcbacd
abcbadc
abcbcad
abcbcda
abcbdca
abcbdac
abcabcd
abcabdc
abcacbd
abcacdb
abcadcb
abcadbc
abccabd
abccadb
abccbad
abccbda
abccdba
abccdab
abcdcab
abcdcba
abcdacb
abcdabc
abcdbac
abcdbca
abdccba
abdccab
abdcbca
abdcbac
abdcabc
abdcacb
abdbcca
abdbcac
abdbacc
abdabcc
abdacbc
abdaccb
acbbacd
acbbadc
acbbcad
acbbcda
acbbdca
acbbdac
acbabcd
acbabdc
acbacbd
acbacdb
acbadcb
acbadbc
acbcabd
acbcadb
acbcbad
acbcbda
acbcdba
acbcdab
acbdcab
acbdcba
acbdacb
acbdabc
acbdbac
acbdbca
acabbcd
acabbdc
acabcbd
acabcdb
acabdcb
acabdbc
acacbbd
acacbdb
acacdbb
acadcbb
acadbcb
acadbbc
accabbd
accabdb
accadbb
accbabd
accbadb
accbbad
accbbda
accbdba
accbdab
accdbba
accdbab
accdabb
acdcabb
acdcbab
acdcbba
acdacbb
acdabcb
acdabbc
acdbacb
acdbabc
acdbcab
acdbcba
acdbbca
acdbbac
adccbba
adccbab
adccabb
adcbcba
adcbcab
adcbbca
adcbbac
adcbabc
adcbacb
adcabbc
adcabcb
adcacbb
adbccba
adbccab
adbcbca
adbcbac
adbcabc
adbcacb
adbbcca
adbbcac
adbbacc
adbabcc
adbacbc
adbaccb
adabbcc
adabcbc
adabccb
adacbbc
adacbcb
adaccbb
baabccd
baabcdc
baabdcc
baacbcd
baacbdc
baaccbd
baaccdb
baacdcb
baacdbc
baadccb
baadcbc
baadbcc
babaccd
babacdc
babadcc
babcacd
babcadc
babccad
babccda
babcdca
babcdac
babdcca
babdcac
babdacc
bacbacd
bacbadc
bacbcad
bacbcda
bacbdca
bacbdac
bacabcd
bacabdc
bacacbd
bacacdb
bacadcb
bacadbc
baccabd
baccadb
baccbad
baccbda
baccdba
baccdab
bacdcab
bacdcba
bacdacb
bacdabc
bacdbac
bacdbca
badccba
badccab
badcbca
badcbac
badcabc
badcacb
badbcca
badbcac
badbacc
badabcc
badacbc
badaccb
bbaaccd
bbaacdc
bbaadcc
bbacacd
bbacadc
bbaccad
bbaccda
bbacdca
bbacdac
bbadcca
bbadcac
bbadacc
bbcaacd
bbcaadc
bbcacad
bbcacda
bbcadca
bbcadac
bbccaad
bbccada
bbccdaa
bbcdcaa
bbcdaca
bbcdaac
bbdccaa
bbdcaca
bbdcaac
bbdacca
bbdacac
bbdaacc
bcbaacd
bcbaadc
bcbacad
bcbacda
bcbadca
bcbadac
bcbcaad
bcbcada
bcbcdaa
bcbdcaa
bcbdaca
bcbdaac
bcabacd
bcabadc
bcabcad
bcabcda
bcabdca
bcabdac
bcaabcd
bcaabdc
bcaacbd
bcaacdb
bcaadcb
bcaadbc
bcacabd
bcacadb
bcacbad
bcacbda
bcacdba
bcacdab
bcadcab
bcadcba
bcadacb
bcadabc
bcadbac
bcadbca
bccaabd
bccaadb
bccabad
bccabda
bccadba
bccadab
bccbaad
bccbada
bccbdaa
bccdbaa
bccdaba
bccdaab
bcdcaab
bcdcaba
bcdcbaa
bcdacab
bcdacba
bcdaacb
bcdaabc
bcdabac
bcdabca
bcdbaac
bcdbaca
bcdbcaa
bdccbaa
bdccaba
bdccaab
bdcbcaa
bdcbaca
bdcbaac
bdcabca
bdcabac
bdcacba
bdcacab
bdcaacb
bdcaabc
bdbccaa
bdbcaca
bdbcaac
bdbacca
bdbacac
bdbaacc
bdabcca
bdabcac
bdabacc
bdacbca
bdacbac
bdaccba
bdaccab
bdacacb
bdacabc
bdaaccb
bdaacbc
bdaabcc
cbbaacd
cbbaadc
cbbacad
cbbacda
cbbadca
cbbadac
cbbcaad
cbbcada
cbbcdaa
cbbdcaa
cbbdaca
cbbdaac
cbabacd
cbabadc
cbabcad
cbabcda
cbabdca
cbabdac
cbaabcd
cbaabdc
cbaacbd
cbaacdb
cbaadcb
cbaadbc
cbacabd
cbacadb
cbacbad
cbacbda
cbacdba
cbacdab
cbadcab
cbadcba
cbadacb
cbadabc
cbadbac
cbadbca
cbcaabd
cbcaadb
cbcabad
cbcabda
cbcadba
cbcadab
cbcbaad
cbcbada
cbcbdaa
cbcdbaa
cbcdaba
cbcdaab
cbdcaab
cbdcaba
cbdcbaa
cbdacab
cbdacba
cbdaacb
cbdaabc
cbdabac
cbdabca
cbdbaac
cbdbaca
cbdbcaa
cabbacd
cabbadc
cabbcad
cabbcda
cabbdca
cabbdac
cababcd
cababdc
cabacbd
cabacdb
cabadcb
cabadbc
cabcabd
cabcadb
cabcbad
cabcbda
cabcdba
cabcdab
cabdcab
cabdcba
cabdacb
cabdabc
cabdbac
cabdbca
caabbcd
caabbdc
caabcbd
caabcdb
caabdcb
caabdbc
caacbbd
caacbdb
caacdbb
caadcbb
caadbcb
caadbbc
cacabbd
cacabdb
cacadbb
cacbabd
cacbadb
cacbbad
cacbbda
cacbdba
cacbdab
cacdbba
cacdbab
cacdabb
cadcabb
cadcbab
cadcbba
cadacbb
cadabcb
cadabbc
cadbacb
cadbabc
cadbcab
cadbcba
cadbbca
cadbbac
ccaabbd
ccaabdb
ccaadbb
ccababd
ccabadb
ccabbad
ccabbda
ccabdba
ccabdab
ccadbba
ccadbab
ccadabb
ccbaabd
ccbaadb
ccbabad
ccbabda
ccbadba
ccbadab
ccbbaad
ccbbada
ccbbdaa
ccbdbaa
ccbdaba
ccbdaab
ccdbbaa
ccdbaba
ccdbaab
ccdabba
ccdabab
ccdaabb
cdcaabb
cdcabab
cdcabba
cdcbaab
cdcbaba
cdcbbaa
cdacabb
cdacbab
cdacbba
cdaacbb
cdaabcb
cdaabbc
cdabacb
cdababc
cdabcab
cdabcba
cdabbca
cdabbac
cdbaacb
cdbaabc
cdbacab
cdbacba
cdbabca
cdbabac
cdbcaab
cdbcaba
cdbcbaa
cdbbcaa
cdbbaca
cdbbaac
dccbbaa
dccbaba
dccbaab
dccabba
dccabab
dccaabb
dcbcbaa
dcbcaba
dcbcaab
dcbbcaa
dcbbaca
dcbbaac
dcbabca
dcbabac
dcbacba
dcbacab
dcbaacb
dcbaabc
dcabbca
dcabbac
dcabcba
dcabcab
dcabacb
dcababc
dcacbba
dcacbab
dcacabb
dcaacbb
dcaabcb
dcaabbc
dbccbaa
dbccaba
dbccaab
dbcbcaa
dbcbaca
dbcbaac
dbcabca
dbcabac
dbcacba
dbcacab
dbcaacb
dbcaabc
dbbccaa
dbbcaca
dbbcaac
dbbacca
dbbacac
dbbaacc
dbabcca
dbabcac
dbabacc
dbacbca
dbacbac
dbaccba
dbaccab
dbacacb
dbacabc
dbaaccb
dbaacbc
dbaabcc
dabbcca
dabbcac
dabbacc
dabcbca
dabcbac
dabccba
dabccab
dabcacb
dabcabc
dabaccb
dabacbc
dababcc
dacbbca
dacbbac
dacbcba
dacbcab
dacbacb
dacbabc
daccbba
daccbab
daccabb
dacacbb
dacabcb
dacabbc
daaccbb
daacbcb
daacbbc
daabccb
daabcbc
daabbcc
630

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容

  • 问题背景### 递归很常用,但确实不好理解,下边这段程序是用来进行数字全排列的由于很多算法需要讲数字全排列后再来暴...
    Moonsmile阅读 392评论 0 0
  • 问题: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,...
    光影墨辰阅读 404评论 0 2
  • 今天面试一家公司,因为简历上写了ACM经历,被问到了PHP字符串全排列算法,当时时间有限只给了思路,回家后把它实现...
    灵魂放逐阅读 1,549评论 0 0
  • 最近因为要完成需求学习前端,在编码上有几个实践觉得可以以后在客户端上研究一下。 1 结构与行为分离 客户端里事件都...
    熊妹妹阅读 101评论 0 0
  • 如今,见面打招呼不聊两句屋子,都显得生分了;就跟已往老北京搁公厕见面都问“吃了吗”一样,如今连大弟子都相互挖苦“买...
    胖乎乎的胖子阅读 199评论 0 0