一:用递归实现
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdlib>
using namespace std;
void CombinationCore(char * str, int len, vector<char> &rs)
{
if(len == 0)//相当于此时的组合串的长度满足最开始的要求了,即m==0
{
vector<char>::iterator it;
for(it = rs.begin(); it < rs.end(); it++)
cout<<(*it);
cout<<endl;
return;
}
if(*str == '\0')//即n == 0
return;
rs.push_back(*str);
//把当前字符当做组合的一部分
CombinationCore(str + 1,len - 1,rs);
rs.pop_back();//删除当前字符,恢复之前的状态
//不把当前字符作为组合的一部分
CombinationCore(str + 1, len,rs);
}
void getCombination(char* str)
{
if(str == NULL)
return;
int length = strlen(str);
vector<char> rs;
for(int i = 1; i <= length; i++)
CombinationCore(str,i,rs);
}
int main()
{
char s[] = "abcd";
getCombination(s);
}
二:数组的组合问题
#include <iostream>
using namespace std;
//深度优先搜索
//10个数中 3个数的组合问题
const int n=5,k=3;
int a[]={0,1,2,3,4,5}; //第一个数不算
int res[n];
/*
两个标志
kk代表组合中的第几个数
start从哪个位置开始选择数字
在可重复的情况下,start一直为1
*/
void dfs(int kk,int start)
{
if(kk>k)
{
for(int i=0;i<=k;i++)
cout<<res[i]<<" ";
cout<<endl;
return;
}
for(int i=start;i<=n;i++)
{
res[kk]=a[i];
dfs(kk+1,i+1); //只有这一行代码与上一个问题代码不同
}
}
int main()
{
dfs(0,0);
return 0;
}