剑指offer之字符串的排序

1.题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

2.分析

1.如果字母都是不同的,那么输出的字符串数量应该是n!,所以如果有三个不同字母,那么就有3*2*1 = 6种排序。我们可以a,b,c分成两部分,前面一部分是一个字符,后面一部分是剩余字符的组合,这是一个递归定义。
2.因为字符可能重复,我们需要进行字符是否相同的判断。如果有相同的字符,需要除以出现字符的可能性。如:aabb,那么组合数量应该是4!/(2!*2!) = 4*3*2*1/(2*1*2*1) = 6。

3.代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Permutation(vector<string>& ans,int k,string str) {
    int size = str.size();
    if(k == size - 1)
    {
        ans.push_back(str);
        return;
    }
    for(int i=k;i<size;++i)
    {
        if(i != k && str[i] == str[k])
            continue;
        char temp = str[i];
        str[i] = str[k];
        str[k] = temp;

        //std::sort(str.begin()+k+1,str.end());
        Permutation(ans,k+1,str);


    }
}
vector<string> Permutation(string str) {
    std::sort(str.begin(),str.end());
    vector<string> ans;
    Permutation(ans,0,str);
    return ans;
}
int main()
{
    string str="ddaa";
    std::sort(str.begin(),str.end());
    vector<string> result = Permutation(str);
    //这里进行排序,是因为不排序,输出结果的顺序也系统不一致
    std::sort(result.begin(),result.end());
    cout<<"counts:"<<result.size()<<endl;
    for(auto& s:result)
        cout<<s<<endl;
    return 0;
}

4.输出结果是:

counts:6
aadd
adad
adda
daad
dada
ddaa

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/82664432