如何求字符串的全排列

一家搜索公司的面试题,当时有这个概念,但是没写出代码,思路不清晰,回来想了下,很简单。

void loop(char* str, int real_size)
{
	int size = strlen(str);
	if(size == 0)
		printf("%s\n", str - real_size);
	for(int i = 0; i < size; i++){
		swap(str[0], str[i]);
		loop(str + 1, real_size);
		swap(str[i], str[0]);
	}
}

思想是:当确定一个位置的字符后,所有全排列的个数就是其后字符串全排列的个数。

如果字符串内有重复的怎么办?从上面的代码可以看到,其实我们是选择了一个当前位置的字符,然后对剩下的字符做了秭归处理,所以关键是选择的当前字符不能有重复。新的代码如下(假设字符串已经有序):

void loop(char* str, int real_size)
{
	int size = strlen(str);
	if(size == 0)
		printf("%s\n", str - real_size);
	for(int i = 0; i < size; i++){
		swap(str[0], str[i]);
		loop(str + 1, real_size);
		swap(str[i], str[0]);
		while(str[i] == str[i + 1]) i++;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值