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

分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。

我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。

既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。

基于前面的分析,我们可以得到如下的参考代码:

void Permutation(char* pStr, char* pBegin);/
// Get the permutation of a string,
// for example, input string abc, its permutation is
// abc acb bac bca cba cab
/
void Permutation(char* pStr)
{Permutation(pStr, pStr);
}/
// Print the permutation of a string,
// Input: pStr   - input string
//        pBegin - points to the begin char of string
//                 which we want to permutate in this recursion
/
void Permutation(char* pStr, char* pBegin)
{if(!pStr || !pBegin)return;// if pBegin points to the end of string,// this round of permutation is finished, // print the permuted stringif(*pBegin == '\0'){printf("%s\n", pStr);}// otherwise, permute stringelse{for(char* pCh = pBegin; *pCh != '\0'; ++ pCh){// swap pCh and pBeginchar temp = *pCh;*pCh = *pBegin;*pBegin = temp;Permutation(pStr, pBegin + 1);// restore pCh and pBegintemp = *pCh;*pCh = *pBegin;*pBegin = temp;}}
}

扩展1:如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办呢?当输入的字符串中含有相同的字符串时,相同的字符交换位置是不同的排列,但是同一个组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

扩展2:输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细。欢迎关注。

本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。

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

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

  1. 程序员面试题精选100题(59)-字符串的组合[算法]

    题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 分析:在本系列博客的第28题<字符串的排列>中,我们详细讨论 ...

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

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

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

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

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

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

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

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

  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. 【转载】Pytorch在加载模型参数时指定设备
  2. KBMMW 的日志管理器
  3. JavaSript实现调用google地图输入经度,纬度移动到该点,同时对点做标记
  4. 笔记-高项案例题-2014年下-计算题
  5. Windows平台下安装Hadoop
  6. html5图像映射坐标怎么看,html学习之创建图像映射
  7. JZ46把数字翻译成字符串
  8. wangeditor中添加超链接校验
  9. H3C交换机SSH配置
  10. 微信小程序插件安装Vant有赞组件库
  11. pcb上钽电容丝印图_pcb钽电容正负极该如何识别
  12. vs code中英文标点符号自动更改
  13. 已解决(Python运行报错)SyntaxError: expression cannot contain assignment, perhaps you meant “==“?
  14. [极致用户体验] 网页里的「返回」应该用 history.back 还是 push ?
  15. flinkcdc实时监测oracle数据库某张表的变化
  16. 《外星人入侵》 教程详解
  17. 【C标准库】详解feof函数与EOF
  18. Oracle使用dblink同步数据
  19. 对16S数据使用PICRUSt预测输出KEGG和COG表
  20. 迅为电子HMI人机界面|CAN总线触摸屏

热门文章

  1. 最讨厌心灵鸡汤 所有失败最终都是人不行
  2. 计网 - TCP 实战:如何进行 TCP 抓包调试?
  3. 深入理解分布式技术 - 从区块链技术看分布式理论的应用
  4. 【动态数组】数据结构01-(java实现)
  5. mysql1.8找回密码_PHP+Mysql+jQuery找回密码
  6. php项目包导入项目,zend studio导入项目文件的图文操作
  7. Python知识: scipy signal.chirp用法例
  8. plsql存储过程修改后怎么保存_证件照上传不成功,教你修改分辨率、调整照片大小...
  9. 关于vue项目中输入框无法正常输入的问题
  10. Python自然语言处理工具包推荐