题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

分析:在本系列博客的第28题《字符串的排列》中,我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用递归的思路来求字符串的组合。

假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;而是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码:

void Combination(char* string)
{if(string == NULL)return;int length = strlen(string);vector<char> result;for(int i = 1; i <= length; ++ i){Combination(string, i, result);}
}void Combination(char* string, int number, vector<char>& result)
{if(number == 0){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);
}

由于组合可以是1个字符的组合,2个字符的字符……一直到n个字符的组合,因此在函数void Combination(char* string),我们需要一个for循环。另外,我们一个vector来存放选择放进组合里的字符。

博主何海涛对本博客文章享有著作权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。对解题思路有任何建议,欢迎在评论中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht与我讨论。谢谢。

程序员面试题精选100题(59)-字符串的组合[算法]相关推荐

  1. 程序员面试题精选100题(28)-字符串的排列[算法]

    题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串 abc ,则输出由字符 a . b . c 所能排列出来的所有字符串 abc . acb . bac . bca . cab 和 ...

  2. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如:如果输入如下矩阵: 1              2              3              4 5     ...

  3. 程序员面试题精选100题(37)-寻找丑数[算法]

    题目:我们把只包含因子 2. 3和 5的数称作丑数(Ugly Number).例如 6. 8都是丑数,但 14不是,因为它包含因子 7.习惯上我们把 1当做是第一个丑数.求按从小到大的顺序的第 150 ...

  4. 程序员面试题精选100题(40)-扑克牌的顺子[算法]

    题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字. 分析:这题目很有意思,是一个典型的寓教于 ...

  5. 程序员面试题精选100题(58)-八皇后问题[算法]

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法 ...

  6. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  7. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  8. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  9. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

最新文章

  1. oracle备份镜像,Oracle RMAN两种备份方式 – 备份集备份与镜像复制备份
  2. 设计模式(10)-装饰模式详解(易懂)
  3. 布线技术不断演进满足快速增长的网络需求
  4. Google上面有自己给你标注好的数据集
  5. html里table的遍历,js遍历table中的tr
  6. opencv环境搭建
  7. Kibana4简单使用
  8. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.1 软件生存周期模型...
  9. Microsoft Visual Studio使用NodeJS
  10. android启动模式
  11. 【数据结构笔记19】File Transfer的C语言实现,集合的简化表示,按秩归并,路径压缩
  12. Android 一些笔记(这只是一些个人笔记)
  13. 4170万元人民币的“绿坝·花季护航”预装1年软件,到底值不值?
  14. 解决登录vCenter提示“当前网站安全证书不受信任“
  15. 机器学习入门 线性回归及梯度下降
  16. HTML5笔记(一)
  17. 微信开发实战(2)—微信公众平台接口调试工具
  18. Dijkstra算法和Floyd算法对比分析
  19. 爬虫学习(16):selenium自动化测试:人为模拟滑块移动
  20. 2021会宁三中高考成绩查询,2021年白银中考录取分数线查询

热门文章

  1. http://nlp.stanford.edu:8080/parser/index.jsp
  2. 雨敲窗python_雨敲窗Python:类
  3. 实战SSM_O2O商铺_42【前端展示】店铺列表页面View层的实现
  4. MyBatis-19MyBatis代码生成器-XML配置详解
  5. Spring-国际化信息01-基础知识
  6. Spring-WebApplicationContext解读
  7. Linux中yum和apt-get
  8. java integer 不变模式_Java代码的变与不变
  9. 华为鸿蒙电脑操作系统测试版,官方公布教程:鸿蒙OS测试版返回EMUI 11
  10. 高德地图区域线显示_护航国庆假期,助力重点区域精细化管理——扬州交警与高德地图联合推出“全境智能”系统...