递归和非递归求解字符组合

递归

#include<bits/stdc++.h>
using namespace std;

void combination(string&,int,int,string&);

void solve(string& str,string& res){
	if(str.empty()) return;
	for(int i=1;i<=str.size();i++) {
	    combination(str,0,i,res);//选i个 
    }
}

void combination(string&str,int id,int num,string&res){
	if(num==0){
		for(int i=0;i<res.size();i++) cout<<res[i];
        cout<<"\n";
        return;
	}
	if(id>=str.size()) return;//递归边界
	res.push_back(str[id]); //把这个字符放到组合里面去 
	combination(str,id+1,num-1,res);
	res.erase(res.end()-1);//不把这个字符放到组合里去 
	combination(str,id+1,num,res);
	//我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:
	//第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;
	//第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。
	
} 

int main(){
	string str="abcdefgh";
	string res;
	solve(str,res);
	return(0);
} 

非递归

//不用递归实现组合
#include<bits/stdc++.h>
using namespace std;

void combination(const string&,int,int,string&); 

void solve(const string& str,string& res){
	int len=str.size();
	for(int i=1;i<(1<<len);i++) {
	    combination(str,len,i,res);//i表示字符串中哪些位置可取 
	    for(int i=0;i<res.size();i++) cout<<res[i];
	    cout<<"\n";
	    res.clear();
    }
}
void combination(const string& str,int len,int flag,string& res){
	for(int i=0;i<len;i++){//flag表示字符串中哪些位置可取 
		if(flag&(1<<i)) res.push_back(str[i]);
	}
} 

int main(){
	string str="abcdefgh";
	string res;
	solve(str,res);
	return(0);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值