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