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

题目描述

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

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

以下是具体实现代码:

 vector Permutation(string str) {

    vector s_unused;
    vector s_used;
    mapm;


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


}

//实现组合排列
void combine(vector s_unused, vector s_used, map &m)
{

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

    for(vector::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();
    }


}

你可能感兴趣的:(C++学习过程)