剑指Offer----面试题28----扩展:字符的所有组合
2016-06-06 22:41
453 查看
题目:
求字符的所有组合,例如输入abc, 则他们的所有组合有a、b、c、ab、ac、bc、abc。分析:
如果输入n个字符,则这n个字符所构成长度为1的组合,长度为2的组合,......,长度为n的组合。求n个字符的长度为m(1<=m<=n)的组合的时候,我们把这n个字符分成两部分:第一个字符和其余的所有字符。如果组合中包含第一个字符,则下一步在剩下的字符例选取m-1个字符;如果组合里不包含第一个字符,则在剩下的字符里选取m个字符。也就是说,我们可以把求n个字符组成长度为m的组合问题分解成两部分,分别求n-1个字符串中长度为m-1的组合,以及求n-1个字符的长度为m的组合。这两种方式都可以用递归的方式解决。源代码如下:
#include<iostream> #include<vector> #include<cstring> using namespace std; static int num = 1; void Combination(char *string, int number, vector<char> &result); void Combination(char *string) { if (string == NULL) { cout << "字符为空" << endl; return; } vector<char> result; int i, length = strlen(string); for (i = 1; i <= length; ++i) Combination(string, i, result);//在长度为string字符串中取出i个组合数 } void Combination(char *string, int number, vector<char> &result) { if (string == NULL) return; if (number == 0) { printf("第%d个组合\t", num++); vector<char>::iterator iter = result.begin(); for (; iter != result.end(); ++iter) printf("%c", *iter); printf("\n"); return; } if (*string == '\0') return; result.push_back(*string); Combination(string + 1, number - 1, result); result.pop_back(); Combination(string + 1, number, result); } void test11() { cout << "\t=======检测空指针=======" << endl; Combination(NULL); cout << endl; } void test12() { cout << "\t=======检测只有分隔符的指针=======" << endl; num = 1; char str[] = ""; Combination(str); cout << endl; } void test13() { cout << "\t=======检测只有一个字符的组合=======" << endl; num = 1; char str[] = "a"; Combination(str); cout << endl; } void test14() { cout << "\t=======检测只有若干个字符的组合=======" << endl; num = 1; char str[] = "abc"; Combination(str); cout << endl; } int main(void) { test11(); test12(); test13(); test14(); system("pause"); return 0; }
运行结果:
=======检测空指针======= 字符为空 =======检测只有分隔符的指针======= =======检测只有一个字符的组合======= 第1个组合 a =======检测只有若干个字符的组合======= 第1个组合 a 第2个组合 b 第3个组合 c 第4个组合 ab 第5个组合 ac 第6个组合 bc 第7个组合 abc 请按任意键继续. . .
相关文章推荐
- 一个关于if else容易迷惑的问题
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例