字符串的组合
2016-03-17 16:32
162 查看
要求:输入一个字符串,输出该字符串的所有组合。如:若字符串为:abc,则应输出:(空集),a、b、c、ab、ac、bc、abc.
思路:考虑到数学中的排列组合知识,我们知道所谓组合即是在字符串中选取某些字符组合在一起,而在二进制中我们可以用0代表未选取某字符,1代表选取了某字符,这样自然可以想到用位运算来实现该过程。位运算结果为1则代表该位被选取。如000代表空集,001代表选取最后一个字符,即c,100代表a。依次类推。注:注意全排列与组合的不同,具体请参看我的博客:字符串的排列
基于上述思路,代码如下:
#include<iostream> using namespace std; char str[] = "abcde"; void print_subset(int n , int index) { printf("{"); for(int i = 0 ; i < n ; ++i) { if( index&(1<<i) ) // 判断index的二进制中哪些位为1,即代表取某一位 printf("%c ",str[i]); //输出选取位对应的字符 } printf("}\n"); } void subset(int n) { for(int index= 0 ; index < (1<<n) ; index++)//因为长度为n的字符串的组合数为2^n,所以index<2^n(即1<<n) { print_subset(n,index); } } int main(void) { subset(5); return 0; }程序运行结果如下:
相关文章推荐
- CUBRID学习笔记 33 net事务 cubrid教程示例
- Android之环境搭建下载路径
- 夺命雷公狗---DEDECMS----7dedecms目录结构
- 第三次作业(2)
- 什么是session ?它和cookie有什么区别和联系
- 78. Subsets
- 3357: [Usaco2004]等差数列|DP
- mysql ERROR 1045 (28000): Access denied for user解决方法 (转)
- android文件上传到服务器
- 第三次作业(1) Visual Studio程序安装过程和练习过程
- 【Java】数组属性的例子
- kettle 邮件 附件 smtp
- UNICODE与ANSI的区别【转】
- spring事务管理几种方式(转)
- 执行ubuntu脚本出现 Syntax error: "(" unexpected错误
- Maven-相关命令
- 对图片的压缩处理
- myeclipse封装webservice接口
- android开发 多线程
- linux网络基础--学习笔记