字符串的排列、组合
2016-04-06 11:02
246 查看
递归方法
1、全排列
测试
2、组合
测试
3、基于位图的字符串的组合
1、全排列
//面试题28:字符串的排列 /* 从集合依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理; n个数的全排列,一共有n!种情况. (n个位置,第一个位置有n种,当第一个位置固定下来之后,第二个位置有n-1种情况...) 全排列的过程: 选择第一个字符 获得第一个字符固定下来之后的所有的全排列 选择第二个字符 获得第一+ 二个字符固定下来之后的所有的全排列 从这个过程可见,这是一个递归的过程。 */ #include <iostream> using namespace std; void Swap(char* c1, char* c2){ char temp = *c1; *c1 = *c2; *c2 = temp; } void Permutation(char* str, char* begin){ if (*begin == '\0'){ cout << str << endl; } else{ for (char* ch = begin; *ch != '\0'; ch++){ Swap(ch, begin); Permutation(str, begin + 1); swap(ch, begin); } } } void Permutation(char* str){ if (str == NULL){ return; } Permutation(str, str); }
测试
char str[] = "abc"; Permutation(str);
2、组合
//面试题扩展:字符串的组合 //递归 #include <string> #include <iostream> using namespace std; void Combination(char* str, int i, string& result); void Combination(char* str){ if (str == NULL){ return; } int length = strlen(str); string result; for (int i = 1; i <= length; i++){ Combination(str, i, result); } } void Combination(char* str, int number, string& result){ if (number == 0){ cout << result << endl; return; } else if (*str == '\0'){ return; } else{ result.push_back(*str); Combination(str + 1, number - 1, result); result.pop_back(); Combination(str + 1, number, result); } }
测试
char str[] = "abc"; Combination(str);
3、基于位图的字符串的组合
//基于位图 /* 假设原有元素n个,最终的组合结果有2^n - 1. 可以使用2^n - 1个位,1表示取该元素,0表示不取。 所以a表示001,取ab是011。 001,010,011,100,101,110,111。对应输出组合结果为:a,b,ab,c,ac,bc,abc。 */ void Combination_bit(char* str){ int length = strlen(str); if (length <= 0){ return; } else{ int n = 1 << length; //2^length for (int i = 0; i < n; i++){ string result; for (int j = 0; j < length; j++){ if ((i&(1 << j))!=0){ result.push_back(str[j]); } } cout << result << endl; } } }
相关文章推荐
- MVC5入门学习
- hadoop namenode又一次格式化以后hbase的hmaster进程启动后立即消失
- 对象的上转型对象
- Linux内核如何装载和启动一个可执行程序
- 安卓linux真机调试
- Java 8新特性-5 内建函数式接口
- Qt学习备忘录(1)
- spark部署
- hdu 1238 Substrings(求子串或者他的逆序子串出现在每个字符串中)
- 起飞啦,css3云彩动画
- 让你的 Node.js 应用跑得更快的 10 个技巧
- 校验和算法
- Windows 下 mysql 自动备份
- cocos2d-x之核心类
- jsTree 点击节点事件及根据 ID 获取节点方法
- 【行测】逻辑推理
- R语言 Shapiro-Wilk检验
- Android Studio插件实现语言国际化
- Java 多线程同步和异步详解
- 用httpPost对JSON发送和接收的例子