ABC全排列得到 ABC,ACB,BAC,BCA,CBA,CAB
ABB全排列得到ABB,BAB,BBA
思想
交换,ABC,首先A和自身交换得到ABC,然后A和B交换,得到BAC,最后A和C交换,得CBA,这样,首位就定下了,接着对ABC这个串来说,只需要递归后面的BC,得到BC,CB,这两个串,加上前面的A即可。同理,后面两个BAC,CBA也是一样的操作
解决了这个,下一步就是去重了,这个思想不太好想,大家可以拿笔模拟一下,比如ABB,这个,A和第一个B交换后,得到BAB,然后递归后面的AB,得到BAB,BBA两个串,对于原来的A,就不需要和第二个B交换了,因为BBA这个串已经出现了,所以去重就是看当前字符到要交换的字符中间,有没有字符和要交换的字符相同,相同就不用换了
ABB,不需要和第二个B换,因为从A开始到第二个B之间,出现了和第二个B一样的元素B
懂了思想,上代码
C语言代码如下
#include <stdio.h>
#include <string.h>
void swap(char *s, int i, int j)
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
int IsSwap(char *s, int from, int to)
{
int j;
for(j=from;j<to;j++){
if(s[j]==s[to])
return 0;
}
return 1;
}
void permutation(char *s, int from, int to)
{ int i;
if (from == to)
{
printf("%s\n", s);
return;
}
else
{
for ( i=from; i <= to; i++)
{
if(IsSwap(s,from,i)==1){
swap(s, i, from);
permutation(s, from + 1, to);
swap(s, from, i);
}
}
}
}
int main()
{
char s[100];
scanf("%s",s);
int len=strlen(s);
permutation(s, 0, strlen(s) - 1);
return 0;
}
小白第一次写