给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,
输出为:
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
Input
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
Output
输出S所包含的字符组成的所有排列
Input示例
1312
Output示例
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
看到全排列 想起曾经用过的next-permutation()函数 这是个全排列函数 此题还可用dfs写(我还不熟悉此方法)
STL解法(已ac)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
char a[10];
cin >> a;
int len = strlen(a);
sort(a, a + len);
do
{
puts(a);
} while (next_permutation(a, a + len));
return 0;
}
dfs解法(已ac)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
/*
int main()
{
char a[10];
cin >> a;
int len = strlen(a);
sort(a, a + len);
do
{
puts(a);
} while (next_permutation(a, a + len));
return 0;
}
*/
char a[10]; //原字符串数组
int b[10]; //字符串改为数字后用排序函数
int c[10]; //判断数组
int d[10]; //得到的全排列数组
int len;
void dfs(int s)
{
int i;
if (s == len)
{
for ( i = 0; i < len; i++)
cout << d[i];
cout << endl;
return;
}
for ( i = 0; i < len; i++) {
if (!c[i])
{
c[i] = 1; //该数字未作为第一个排序
d[s] = b[i];
dfs(s + 1); //找下一个数字
c[i] = 0; //该数字已使用完毕
while (i -1 < len&&b[i] == b[i + 1]) //排除相同数字的情况
i++;
}
}
}
int main()
{
cin >> a;
len = strlen(a);
for (int j = 0; j < len; j++)
b[j] = a[j] - '0';
sort(b, b + len);//升序排序
dfs(0);
return 0;
}