【題目描述】
輸入一個字符串,打印出該字符串中字符的所有排列。
例如輸入字符串abc,則輸出由字符a、b、c 所能排列出來的所有字符串
abc、acb、bac、bca、cab 和 cba。
【分析】
從集合中依次選出每一個元素,作為排列的第一個元素,然后對剩余的元素進行全排列,如此遞歸處理,從而得到所有元素的全排列。以對字符串abc進行全排列為例,我們可以這么做:以abc為例
固定a,求后面bc的排列:abc,acb,求好后,a和b交換,得到bac
固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba
固定c,求后面ba的排列:cba,cab。【代碼】
#include
#include
#include
void swap(char *str, int begin, int k)
{
char tmp;
tmp = *(str + begin);
*(str + begin) = *(str + k);
*(str + k) = tmp;
}
int is_swap(char *str, int begin, int k)
{
int i;
for (i = begin; i < k; i ++)
if(*(str + i) == *(str + k))
return 0;
return 1;
}
void permutation(char *str, int begin, int end)
{
int k;
if (begin == (end - 1)) {
printf("%s\n", str);
return;
}
for (k = begin; k < end; k++)
if(is_swap(str, begin, k)) {
swap(str, begin, k);
permutation(str, begin + 1, end);
swap(str, begin, k);
}
}
int main(void)
{
char str[10];
int length;
gets(str);
length = strlen(str);
printf("%d\n", length);
permutation(str, 0, length);
return 0;
}