题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母,例如ac
输出描述:
[ac, ca]
输入样例:
acc
输出样例:
[acc, cac, cca]
解题思路:
蘑菇街19年校招题,一个典型的全排列问题。关于全排列问题,之前写到过一篇博文:全排列 next_permutation的使用,这里就不再介绍next_permutation了。需要注意的是:题目给出的字符串不一定是升序的,有个测试点是aA,如果不先用sort把字符串str升序排列一遍字符串的话,这个测试点会报错(预期输出是[Aa, aA],而实际输出会是[aA])。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
bool isVirgin = true; //判断是不是第一次
while(getline(cin,str))
{
string result = ""; //结果字符串
sort(str.begin(), str.end()); //题目中给出的字符串不一定是升序,有个测试点是aA,所以我们自己先升序排列一遍
do{
if(isVirgin)
{
result += "[" + str;
isVirgin = false;
}
else
{
result += ", " + str; //注意逗号后面有个空格
}
}while(next_permutation(str.begin(),str.end())); //全排列
result += "]";
cout << result << endl;
}
return 0;
}