给出一个字符串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
思路:dfs+set去重
#include <bits/stdc++.h>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define sz(x) ((int)(x).size())
using namespace std;
string s;
int a[15];
int b[15];
int v[15]={0};
int len;
set<string> iset;
void dfs(int m){
if(m == len + 1) {
string s1;
rep(i, 1, len + 1) {
s1 += a[b[i]] + '0';
}
iset.insert(s1);
return ;
}
for(int i = 1; i <= len; i++) {
if(v[i] == 0) {
b[m] = i;
v[i] = 1;
dfs(m + 1);
v[i] = 0;
}
}
}
int main()
{
cin >> s;
len = sz(s);
rep(i, 0, len){
a[i+1] = s[i] - '0';
}
sort(a+1, a+1+len);
dfs(1);
set<string>::iterator it;
for(it = iset.begin(); it != iset.end(); ++it) {
cout<< *it <<endl;
}
return 0;
}