字符串的组合问题 递归和非递归实现

本文介绍两种生成特定格式组合函数的方法:递归法和位图思想。递归法通过选择或不选择当前元素来构建所有可能的子集组合;位图法则利用二进制数的不同位表示来生成组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求一个组合函数如p([1,2,3])输出:[1][2][3][1,2][2,3][1,3][1,2,3]

1、递归的方法:

每次选择和不选择这个字符,然后依次递归。


void Combination(char *str)
{
	void Solution(char *, vector<char>&, int);
	if(str == NULL)
		return;
	int n = strlen(str);
	for(int i = 1; i <= n; ++i)//组合中含有几个字符
	{
		vector<char> Result;
		Solution(str, Result, i);
	}
}

void Solution(char *str, vector<char>&Result, int i)
{
	if(*str == '\0' && i > 0)
		return;
	if(i == 0)
	{
		for(vector<char>::iterator iter = Result.begin(); iter != Result.end(); ++iter)
			cout<<*iter;
		cout<<endl;
		return;
	}
	Result.push_back(*str);//这次组合中选择这个字符
	Solution(str+1, Result, i-1);
	Result.pop_back();//这次组合中不选择这个字符
	Solution(str+1, Result, i);
}

1、 位图的思想

N个字符的组合共有2n-1种组合方式,设置一个变量i1增长到2n-1i的二进制表示每个byte位上为1,则输出字符串中对应的字符。

例如字符串为”123”,i1的时候二进制为001,最低位为1,则对应的组合是3i7的时候二进制位111,则对应的组合为123.

void Combination2(char *str)
{
	int Length = strlen(str);
	int n = 1<<Length;
	for(int i = 1; i < n; ++i)
	{
		int j = 1 <<(Length -1);
		int count = 0;
		while(j >= 1)
		{
			if(i & j)//如果这位的数字是1,输出字符串中对应位的字符
				cout<<*(str + Length -1 - count);
			++count;
			j >>= 1;
		}
		cout<<endl;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值