- 题目描述:
-
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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 }