剑指Offer----面试题28----扩展:字符的所有组合

题目:


求字符的所有组合,例如输入abc, 则他们的所有组合有a、b、c、ab、ac、bc、abc。

分析:

如果输入n个字符,则这n个字符所构成长度为1的组合,长度为2的组合,......,长度为n的组合。求n个字符的长度为m(1<=m<=n)的组合的时候,我们把这n个字符分成两部分:第一个字符和其余的所有字符。如果组合中包含第一个字符,则下一步在剩下的字符例选取m-1个字符;如果组合里不包含第一个字符,则在剩下的字符里选取m个字符。也就是说,我们可以把求n个字符组成长度为m的组合问题分解成两部分,分别求n-1个字符串中长度为m-1的组合,以及求n-1个字符的长度为m的组合。这两种方式都可以用递归的方式解决。

源代码如下:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

static int num = 1;

void Combination(char *string, int number, vector<char> &result);

void Combination(char *string)
{
	if (string == NULL)
	{
		cout << "字符为空" << endl;
		return;
	}
	vector<char> result;
	int i, length = strlen(string);
	for (i = 1; i <= length; ++i)
		Combination(string, i, result);//在长度为string字符串中取出i个组合数
}

void Combination(char *string, int number, vector<char> &result)
{
	if (string == NULL)
		return;
	if (number == 0)
	{
		
		printf("第%d个组合\t", num++);

		vector<char>::iterator iter = result.begin();
		for (; iter != result.end(); ++iter)
			printf("%c", *iter);
		printf("\n");
		return;
	}
	if (*string == '\0')
		return;
	result.push_back(*string);
	Combination(string + 1, number - 1, result);
	result.pop_back();
	Combination(string + 1, number, result);
}

void test11()
{
	cout << "\t=======检测空指针=======" << endl;
	Combination(NULL);
	cout << endl;
}

void test12()
{
	cout << "\t=======检测只有分隔符的指针=======" << endl;
	num = 1;
	char str[] = "";
	Combination(str);
	cout << endl;
}

void test13()
{
	cout << "\t=======检测只有一个字符的组合=======" << endl;
	num = 1;
	char str[] = "a";
	Combination(str);
	cout << endl;
}

void test14()
{
	cout << "\t=======检测只有若干个字符的组合=======" << endl;
	num = 1;
	char str[] = "abc";
	Combination(str);
	cout << endl;
}

int main(void)
{
	test11();
	test12();
	test13();
	test14();

	system("pause");
	return 0;
}

运行结果:
        =======检测空指针=======
字符为空

        =======检测只有分隔符的指针=======

        =======检测只有一个字符的组合=======
第1个组合       a

        =======检测只有若干个字符的组合=======
第1个组合       a
第2个组合       b
第3个组合       c
第4个组合       ab
第5个组合       ac
第6个组合       bc
第7个组合       abc

请按任意键继续. . .


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值