虽说STL标准库中有next_permutation这样的函数来秒掉这题,但如果用递归深搜呢?
一个不小心就TLE了。
为了提高代码的可读性,稍微写得复杂了点
ac代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[210];
int sn[29], vn[29];
char vec[210], ed = '\0';
void print_all_permutation(int n, int cnt) {
if(cnt==n) {
vec[n] = ed;
printf("%s\n", vec);
return;
}
for(int i=0; i<n; i++) if(!i||str[i]!=str[i-1]) {
int c1 = vn[str[i]-'a'], c2 = sn[str[i]-'a'];
if(c1 < c2) {
vec[cnt] = str[i];
vn[str[i]-'a'] ++;
print_all_permutation(n, cnt+1);
vn[str[i]-'a'] --;
}
}
}
int main() {
while(scanf("%s", str) != EOF) {
memset(sn, 0, sizeof(sn));
memset(vn, 0, sizeof(vn));
int len = strlen(str);
sort(str, str+len);
for(int i=0; i<len; i++) {
sn[str[i]-'a'] ++;
}
print_all_permutation(len, 0);
}
}