字符串的组合问题 递归和非递归实现
2013-04-06 15:50
274 查看
求一个组合函数如p([1,2,3])输出:[1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3]
1、递归的方法:
每次选择和不选择这个字符,然后依次递归。
1、 位图的思想
N个字符的组合共有2n-1种组合方式,设置一个变量i从1增长到2n-1,i的二进制表示每个byte位上为1,则输出字符串中对应的字符。
例如字符串为”123”,当i为1的时候二进制为001,最低位为1,则对应的组合是3,i为7的时候二进制位111,则对应的组合为123.
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种组合方式,设置一个变量i从1增长到2n-1,i的二进制表示每个byte位上为1,则输出字符串中对应的字符。
例如字符串为”123”,当i为1的时候二进制为001,最低位为1,则对应的组合是3,i为7的时候二进制位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; } }
相关文章推荐
- 字符串全排列与全组合的递归实现-Java版
- java实现字符串排列组合问题
- 关于算法—— 一维字符串数组之间组合问题的C#实现
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- Java 非递归实现的排列组合中的平均分组问题
- powerset 幂集函数(组合问题)的递归实现
- 递归实现组合问题
- 递归实现排列组合问题
- 递归三兄弟——数的乘方、背包问题、组合的Java实现
- 打印给定一字符串的所有字母组合——递归实现
- 递归实现排列组合问题
- (转)一维字符串数组之间组合问题的C#实现
- 字符串的组合 位图和递归分别实现
- 关于数学组合问题在m个球中取n个球-递归实现
- java实现字符串排列组合问题
- 字符串的组合算法问题的C语言实现攻略
- 多个数组间元素排列组合问题求解(Java实现) 标签: 递归排列组合循环
- 剑指Offer28字符串的排列(递归和非递归实现)扩展有重复元素的排列,字符串的组合种类
- 用非递归方法实现 求解字符串组合的问题 JAVA代码
- 组合问题---递归实现