排列组合问题的C++代码

来源:互联网 发布:淘宝账户被冻结怎么办 编辑:程序博客网 时间:2024/06/05 13:26

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这本质上是个排列组合问题。只是加了去除重复的情况。
如果假如输入没有重复,则可以建立两个集合set,一个集合存放尚未排列过的元素,一个集合存放已经排列过的元素。然后依次将未排列的集合中的元素移入已排列集合中。递归实现移入的过程。
如果输入中有重复元素,则不能用集合set装元素,因为set自动去除重复元素。所以可以用vector装元素。

以下是具体实现代码:

 vector<string> Permutation(string str) {

    vector<char> s_unused;
    vector<char> s_used;
    map<string, int>m;


    for(int i = 0; i<str.length(); i++)
    {
       s_unused.push_back(str[i]);
    }
    combine(s_unused, s_used, m);
    vector<string> rtn;
    for(map<string, int>::iterator it = m.begin(); it != m.end(); it++)
    {
        rtn.push_back(it->first);
    }
    return rtn;


}

//实现组合排列
void combine(vector<char> s_unused, vector<char> s_used, map<string, int> &m)
{

    if(s_unused.empty())
    {
       string s;
        for(vector<char>::iterator it = s_used.begin(); it != s_used.end(); it++)
        {
            s += *it;
        }
        m[s] = 1;
        return;
    }

    for(vector<char>::iterator it = s_unused.begin(); it != s_unused.end(); it++)
    {
       //依次将未排列的元素移入已排列的容器中
        char tmp = *it;
        s_used.push_back(tmp);
        s_unused.erase(it);
        combine(s_unused, s_used, m);
        s_unused.insert(it, tmp);
        s_used.pop_back();
    }


}
0 0
原创粉丝点击