《剑指offer》面试题28

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

分析:  当我看到这个题目,我首先想到字符串中字符有可能重复,这时候该怎么办,如果没有重复那就是将所有字符的排列打印出来,全排列也是不怎么好求的,再往下就不好想了;

书中用了分治的思想,将大问题分解为小问题。此题中将一个字符串分解为两部分,第一部分为它的第一个字符,第二部分为后面的所有字符。

求一个字符串的全排列,可以分两步:首先求出所有可能出现在第一个位置的字符,在字符串中可以采用把第一个字符与后面的所有字符交换的方法,如abc字符串中a分别于b、c交换,第一个位置的字符可能是a、b、c;第二步固定第一个字符,求后面字符的排列。如此递归,直到后面的字符为字符串尾。

但是,书上的思路并没有考略字符串中字符重复的问题,如字符串aaa,按照上述思路,排列有6种,但实际上每种都是aaa,所以应该是只有一种。

因此上述思路在我看来不是完全准确的,当把第一个字符与后面的字符交换时,首先应该判断两者是否相同,如果相同则跳过,因为已经处理过此种情况。

但是这个思路同样是有问题的,如aabb,还是会出现重复的情况。。对于解决重复没有想到什么好方法。。。

所以还是默认全排列就是所有字符不管是否相同的全排列。

代码:

在函数中pStr指向整个字符串的第一个字符串,pBegin指向当前我们做排列操作的字符串的第一个字符。每一次递归从pBegin向后扫描每一个字符,交换两者后,再对pBegin后面的字符串递归地做排列操作。

void Permutation(char* pStr)
{if(pStr == NULL)return;Permutation(pStr, pStr);
}void Permutation(char* pStr, char* pBegin)
{if(*pBegin == '\0'){printf("%s\n", pStr);}else{for(char* pCh = pBegin; *pCh != '\0'; ++ pCh){if( pCh == pBegin ){Permutation(pStr, pBegin + 1);continue;}/*if( *pCh == *pBegin )  //去除和第一个字符相同的{continue;}*/char temp = *pCh;*pCh = *pBegin;*pBegin = temp;Permutation(pStr, pBegin + 1);temp = *pCh;*pCh = *pBegin;*pBegin = temp;}}
}

面试题整理8 字符串的排列相关推荐

  1. 【IT笔试面试题整理】字符串的排列

    [试题描述]输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. 分析:这是一道很好的考查对 ...

  2. 剑指offer——面试题28:字符串的排列

    剑指offer--面试题28:字符串的排列 Solution1: 2018年9月2日重做 典型的DFS套路,LeetCode 46 && 47 [46]https://blog.csd ...

  3. [剑指offer]面试题28:字符串的排列

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

  4. 牛客网在线编程专题《剑指offer-面试题28》字符串的排列

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容,分享 ...

  5. 【IT笔试面试题整理】字符串的组合

    [试题描述]输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出 ...

  6. 【IT笔试面试题整理】字符串转数组+数组转字符串

    [试题描述]定义一个函数,字符串转数组数组转字符串 [参考代码] 1 public static int strToInt(String str) 2 { 3 int i = 0, num = 0; ...

  7. java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...

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

  8. 【剑指offer】面试题38:字符串的排列(Java)

    输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["abc" ...

  9. 面试题整理 8 字符串排序扩展题

    <剑指offer>扩展题, (1)求字符串所有字符的组合 分析:同样采取分治的思想,如果输入n个字符,则可以构成长度为1.2...n的组合.在n个字符求长度为m的组合时,可以分解为第一个字 ...

最新文章

  1. DCIC 2021数据挖掘新赛题开放!
  2. HGST:中国将成为新云端运算大国
  3. [专题总结]AC自动机
  4. 只需三分钟!教会你如何选购及维护UPS蓄电池?
  5. 如何搭建MGRE——实验
  6. linux 下共享库创建及使用
  7. 不擅演讲的马化腾在 08 年讲了什么?
  8. 全球首富贝索斯离婚第二天 出轨对象女主播宣布离婚...
  9. 响应式滚动图懒加载 element ui el-carousel 组件优化代码
  10. filter:alpha(opacity=100,style=1)
  11. Learn OpenGL(五)——定义自己的着色器
  12. 学习之法 —— 如何阅读代码、如何编写代码
  13. UIButton常用属性
  14. 第一代计算机硬件逻辑主要采用,第一代计算机的硬件逻辑主要采用电子管,程序设计语言采用BASIC语言...
  15. 汉庭加盟:连锁酒店影视房的市场分析
  16. 弘辽科技:拼多多DSR动态评分有多么的重要
  17. Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
  18. java统计误码率_MATLAB通信工具箱来计算误码率
  19. model 和WEB前台页面提交完美自动填充
  20. Pandas数据分析14——pandas数据框的多层索引

热门文章

  1. Youtube推荐系统是如何挖掘用户内心另一面的
  2. [特征工程系列三]显性特征的衍生
  3. 涉及支付,资金方案的操作要考虑的问题
  4. 李宏毅深度学习——分类
  5. 【行业报告】信贷场景下全流程数据风控体系——宜信
  6. Transformer 在美团搜索排序中的实践
  7. 3. Nest Provider
  8. 同盾科技完成 7280 万美元 C 轮融资
  9. 无约束最优化方法-牛顿法
  10. 技术向:一文读懂卷积神经网络