1.题目描述
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有’a’<b’< ...<,z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
2.输入和输出
输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:已知S = sIs2...sk ,T = tlt2...tk,则S< T 等价于,存在p (1 <= p <= k),使得sl = tl, s2 = t2,..., sp - 1 = tp - l, sp < tp成立
3.样例输入
abc |
4.样例输出
abc acb bac bca cab cba |
5.解题思路
写一个交换函数swap;
构建一个递归函数 通过交换位置的思想,对每一个元素可能交换的情况都包含在内:
此处很巧妙:先交换俩项,然后递归到下一次交换,再换回来,进入下一次的循环中;
for(i=k;i<n;i++)
{swap((a+k),(a+i));
fun(a,k+1,n);
swap((a+i),(a+k));
}
}
6.代码
#include <stdio.h>
#include <string.h>
int swap(char *x,char *y)
{ char m=*x;
*x=*y;
*y=m;
}
void fun(char *a,int k,int n )
{ int i;
if(k==n-1) printf("%s\n",a);
else {
for(i=k;i<n;i++)
{swap((a+k),(a+i));
fun(a,k+1,n);
swap((a+i),(a+k));
}
}
}
int main()
{ char a[6];
int n;
scanf("%s",a);
n=strlen(a);
fun(a,0,n);
}