字符全排列去重

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;
}

小白第一次写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值