求字符串的全部组合(字符串中无重复字符)
2015-10-19 17:14
281 查看
中午吃东西时候看到这道题有个奇妙的解法挺好玩,求字符串“abcd”的全部组合。
输入:“abcd”
输出:”a”,”b”,”c”,”d”,”ab”,”ac”,”ad”,”bc”,”bd”,”cd”,”abc”,”abd”,”acd”,”bcd”,”abcd”。当然不要求顺序也完全相同。以往的想法是通过深度优先搜索,用递归实现,思路比较常见。但是中午大神给出的这种想法是生成(2^n) - 1个数字,判断数字的每个二进制位是否为一,是一的话就把该位置对应的字符添加到字符串里。
下面是代码实现:
输入:“abcd”
输出:”a”,”b”,”c”,”d”,”ab”,”ac”,”ad”,”bc”,”bd”,”cd”,”abc”,”abd”,”acd”,”bcd”,”abcd”。当然不要求顺序也完全相同。以往的想法是通过深度优先搜索,用递归实现,思路比较常见。但是中午大神给出的这种想法是生成(2^n) - 1个数字,判断数字的每个二进制位是否为一,是一的话就把该位置对应的字符添加到字符串里。
下面是代码实现:
#include <iostream> #include <vector> using namespace std; string getSubstring(string str,int num){ string tem; //cout << num << endl; int len = str.size(); int n = len - 1; while(num){ if(num & 0x1){ tem += str ; } num = num >> 1; --n; } return tem; } vector<string> func(string str){ int len = str.size(); vector<string> res; int num = 1 << len; num = num - 1; //cout << num << endl; for(int i = 1;i <= num;++i){ string tem = getSubstring(str,i); res.push_back(tem); } return res; } int main(int argc, char *argv[]) { for(auto str : func("abcd") ) cout << str << ','; return 0; }
相关文章推荐
- 带GUI界面的重置域账号密码PowerShell脚本
- struts 2的类型转化
- ios编程--AVCapture编程理解
- 8.2.1.4 Index Merge Optimization 索引合并优化
- 开发不改bug?给你支个招
- 交通灯管理系统
- android 控制POS机图文打印(二)
- 修改Android OS操作系统的代码,自动请求AGPS
- AVCaptureSession 拍照,摄像,载图总结
- 黑马程序员--Java学习日记之面向对象(封装,继承和构造方法)
- 第8周、项目2—建立链串的算法库
- 集合框架的基本操作
- 国际化 本地化
- Data Base 常用数据库参数的前缀表示符合
- 第八周--项目一--建立顺序串的算法库
- iOS 9系统策略更新,微信分享无法使用解决办法
- 2015年10月17日作业
- BZOJ 4300 绝世好题 递推
- 熟悉linux-部署多个tomcat
- 高斯模糊的算法