[九度][何海涛] 字符串的排序

题目描述:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入:

每个测试案例包括1行。

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

输出:

对应每组数据,按字典序输出所有排列。

样例输入:
abc
BCA
样例输出:
abc
acb
bac
bca
cab
cba
ABC
ACB
BAC
BCA
CAB
CBA

这题先把字符串排序,当本次要使用某个字符时,如果它和前面一个字符相同则前面的字符被使用了,它才能使用,这样就避免了重复。另外cout这题要超时,所以用printf,所以递归开始前先开一个C字符串数组。
 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 bool canUse[10];
10 
11 void dfs(int dep, int maxDep, string &s, char ans[])
12 {
13     if (dep == maxDep)
14     {
15         ans[dep] = '\0';
16         printf("%s\n", ans);
17         return;
18     }
19 
20     for(int i = 0; i < maxDep; i++)
21         if (canUse[i])
22         {
23             if (i != 0 && s[i] == s[i-1] && canUse[i-1])
24                 continue;
25 
26             canUse[i] = false;
27             ans[dep] = s[i];
28             dfs(dep + 1, maxDep, s, ans);
29             canUse[i] = true;
30         }
31 }
32 
33 int main()
34 {
35     string s;
36     while(cin >> s)
37     {
38         sort(s.begin(), s.end());
39         memset(canUse, true, sizeof(canUse));
40         char *ans = new char[s.size() + 1];
41         dfs(0, s.size(), s, ans);
42         delete [] ans;
43     }
44 }


原文地址:https://www.cnblogs.com/chkkch/p/2780757.html