下述的代码可以用来生成一个集合的所有长度为k子集, 算法思路比较简单:当集合中的任何一个元素有二个选择,要么放入结果集合,要么不放入, 这二种情况都要考虑。 用递归去做是比较简单的。
算法步骤:
1)当满足长度的时候,递归出口
2)当集合中所有的元素都参与计算,返回;
3)当前的集合的一个元素加入部分结果集
4)递归调用:从下个元素开始,k=k-1;
5) 把上个元素从当前的部分结果集去掉这个元素
6)递归调用:从下个元素开始
void combination(const char *src, int k, vector<char>& result)
{
if (k== 0)
{
string str(result.begin(), result.end());
cout << str << " ";
return;
}
if (*src == '\0') return;
result.push_back(*src);
combination(src + 1, k- 1, result);
result.pop_back();
combination(src + 1, k, result);
}
变量result 用于保存部分结果集合。
测试用例则非常简单:
bool test_all_sub_set()//测试用例
{
vector<char> result;
combination("abcde", 3, result);//生成所有长度为3的子集合
return 1;
}