何海涛:《剑指Offer:名企面试官精讲典型编程题》:九度OJ
-
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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
-
题目描述:http://ac.jobdu.com/problem.php?cid=1039&pid=11
-
输入:
-
输出:
-
样例输入:
-
样例输出:
代码AC:
思想:全排列 问题!
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
void def_all(int dep, int dp, string &s, char ret[], bool ok[])
{
if (dep == dp)
{
ret[dep] = '\0';
printf("%s\n", ret);
return;
}
for(int i = 0; i < dp; i++)
if (ok[i])
{
if (i != 0 && s[i] == s[i-1] && ok[i-1])
continue;
ok[i] = false;
ret[dep] = s[i];
def_all(dep + 1, dp, s, ret, ok);
ok[i] = true;
}
}
int main()
{
string s;
bool ok[10];
while(cin >> s)
{
sort(s.begin(), s.end());
memset(ok, true, sizeof(ok));
char *ret = new char[s.size() + 1];
def_all(0, s.size(), s, ret, ok);
delete [] ret;
}
return 0;
}