【转】递归生成集合的所有组合

简介: 本文原文链接:http://blog.csdn.net/syzcch/article/details/8208784 题目描述 输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{1,2} , 需要生成的组合有{1},{1, 2},{2} 。

本文原文链接:http://blog.csdn.net/syzcch/article/details/8208784

题目描述

输入一个集合,需要生成该集合所能得出的所有组合。举例说明:若输入集合为{1,2} , 需要生成的组合有{1},{1, 2},{2} 。该题目与生成集合的全排列有很多相似之处,同样也是一个很经典的问题。

 

 

解决思路

 

在我前面的一篇文章:Gray Code实现按序产生集合的所有子集   http://blog.csdn.net/syzcch/article/details/7899691   中讲述了如何利用Gray Code生成集合的所有子集。这里我们利用递归的思想来实现该问题的解。

面对这样一个问题,我们需要仔细分析。题目要求生成一个集合的所有组合,也就是需要生成集合里的元素所能够组成的所有组合。于是一个很明显的思路就是要遍历该集合。一提到遍历集合,可以使用循环或者递归来实现。针对本问题,利用递归的思想是很方便的。

假设我们的集合为{1,2,3} ,我们从头扫描集合的元素,第一个元素为1。对于这个元素,我们可以把他放到组合集中,然后在剩下的集合里再去选择;也可以不把他放到组合集中,在剩下的集合里去选择元素放到组合集中。一般化的,假设我们的集合有n个元素,要求m个元素的组合。我们扫描每一个元素,针对该元素,我们可以将其放到组合集中,然后在剩下的n-1个元素中再选择m-1个元素;我们也可以不放该元素进集合,而直接从剩下的n-1个元素中选择m个元素。这已经是非常清晰的递归的思想了,具体代码如下。

 

代码

 1 void combination(char *src,int num, vector<char>& result)
 2 {
 3     if(num==0)
 4     {
 5         vector<char>::iterator iter=result.begin();
 6         for(;iter<result.end();iter++)
 7         {
 8             printf("%c",*iter);
 9         }
10         printf("\n");
11         return;
12     }
13     if(*src=='\0') return;
14     result.push_back(*src);
15     combination(src+1,num-1,result);
16     result.pop_back();
17     combination(src+1,num,result);
18 }
19 
20 void all_sub_set(char *src)
21 {
22     assert(src);
23     if(!src) return;
24     int i=0;
25     int len=strlen(src);
26     vector<char> result;
27 
28     for(i=1;i<=len;i++)
29     {
30         combination(src,i,result);
31     }
32 }
View Code

 

 

 

相关文章
|
7月前
|
算法 Java
Java数据结构与算法:用于处理不相交集合的合并和查找问题
Java数据结构与算法:用于处理不相交集合的合并和查找问题
|
7月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
|
7月前
|
存储 算法
数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)
数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)
41 0
|
8月前
|
机器学习/深度学习 算法 测试技术
【状态压缩 并集查找 图论】2157. 字符串分组
【状态压缩 并集查找 图论】2157. 字符串分组
|
8月前
合并集合(并查集)
合并集合(并查集)
30 1
|
8月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
57 0
|
Python
新元素组合
新元素组合
63 0
|
算法
组合排序回溯编程题集合(leetcode)
组合排序回溯编程题集合(leetcode)
|
JavaScript
你能给出几种实现数组扁平化的方法?
扁平化数组没听过?那应该听说过扁平化管理吧,这可是互联网公司面试时的通用话术。简单的说,扁平化就是减少层级,可根据需要减少一个层级,或者减少到只有一个层级。扁平化数组就是将多重嵌套的数组,重新整理成一维数组。接下来就来看看可以怎么实现这种效果吧。
261 0
你能给出几种实现数组扁平化的方法?
|
机器学习/深度学习 前端开发 rax
【集合论】集合概念与关系 ( 真子集 | 空集 | 全集 | 幂集 | 集合元素个数 | 求幂集步骤 )
【集合论】集合概念与关系 ( 真子集 | 空集 | 全集 | 幂集 | 集合元素个数 | 求幂集步骤 )
430 0