- 题目描述:
-
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b)
{
char *c = (char *)a;
char *d = (char *)b;
return (*c > *d) ? 1 : -1;
}
void swap(char *a, char *b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
void reverse(char *start, char *end)
{
while(start < end)
{
swap(start++, end--);
}
}
int next_permutation(char *str, char *end)
{
if(str == end)
{
return 0;
}
char *p, *q, *find;
end--;
p = end;
while(p != str)
{
q = p;
--p;
if(*p < *q)
{
find = end;
while (*find <= *p)
{
--find;
}
swap(find, p);
reverse(q, end);
return 1;
}
}
reverse(p, end);
return 0;
}
int main(void)
{
char str[10];
while(scanf("%s", str) != EOF)
{
int len = strlen(str);
qsort(str, len, sizeof(char), cmp);
puts(str);
while ( 1 == next_permutation(str, str+len) )
{
puts(str);
}
}
return 0;
}
/**************************************************************
Problem: 1369
User: tcals
Language: C
Result: Accepted
Time:60 ms
Memory:912 kb
****************************************************************/