字符串的排列组合及其扩展问题

本文探讨了字符串的排列问题,提出了解决方法,并通过全排列解决了8皇后问题和8个数字分配到正方体顶点的问题。同时,介绍了字符串的组合问题,包括递归和位操作两种实现方式。
摘要由CSDN通过智能技术生成

 剑指offer面试题28~字符串的排列问题及其扩展

 一.字符串的排列问题

   输入一个字符串打印出该字符串的所有排列,例如输入字符串"abc",则打印出由字符串"a,b,c"所能排列出的所有字符串:abc,acb,bac,bca,cab和cba。

   如何求出这个字符串的所有排列序列呢?我们通过观察发现abc和acb这两个字符序列发现:这两个字符序列的第一个字符是相同的,只有后两个字符的位置进行了交换,后面的也是类似。

   那仫就得到了求字符串全排列的方法了,就是将该字符串划分为两部分:第一部分就是该字符串的第一个字符,第二部分是后面的剩余字符。而我们在求字符串的全排列的过程中可以分为两步来实现:首先求所有可能出现在第一个位置的字符,就是将第一个字符和后面所有的字符交换;对于后面的剩余部分,我们依然将该字符串划分为两部分,后面剩余串的第一个字符和后面所有的字符,然后按照类似上面的方式进行交换。

   有了实现的想法之后还可能存在什仫问题呢?就是去重的问题,如果给定的字符串是"abb"呢?由于第二个字符和第三个字符相等是不是就不用交换了呢?所以去重的实质就是:从第一个数起的每个数和它后面的非重复出现的字符交换

   

bool IsSwap(char *start,char *end)
{
	char *cur=start;
	while(cur != end)
	{
		if(*cur == *end)
			return false;
		++cur;
	}
	return true;
}

void RankPart(char *str,char *start)
{
	static int count=0;
	assert(str && start);
	if(*start == '\0')   
	{
		count++;  //统计全排列字符的个数
		cout<<count<<":"<<str<<endl;
	}
	else
	{
		char *ch=start;
		while(*ch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值