面试题整理8 字符串的排列
《剑指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 字符串的排列相关推荐
- 【IT笔试面试题整理】字符串的排列
[试题描述]输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab,cba. 分析:这是一道很好的考查对 ...
- 剑指offer——面试题28:字符串的排列
剑指offer--面试题28:字符串的排列 Solution1: 2018年9月2日重做 典型的DFS套路,LeetCode 46 && 47 [46]https://blog.csd ...
- [剑指offer]面试题28:字符串的排列
面试题28:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. ...
- 牛客网在线编程专题《剑指offer-面试题28》字符串的排列
我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 公众号介绍:Microstrong(小强)同学主要研究机器学习.深度学习.计算机视觉.智能对话系统相关内容,分享 ...
- 【IT笔试面试题整理】字符串的组合
[试题描述]输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出 ...
- 【IT笔试面试题整理】字符串转数组+数组转字符串
[试题描述]定义一个函数,字符串转数组数组转字符串 [参考代码] 1 public static int strToInt(String str) 2 { 3 int i = 0, num = 0; ...
- java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...
输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...
- 【剑指offer】面试题38:字符串的排列(Java)
输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["abc" ...
- 面试题整理 8 字符串排序扩展题
<剑指offer>扩展题, (1)求字符串所有字符的组合 分析:同样采取分治的思想,如果输入n个字符,则可以构成长度为1.2...n的组合.在n个字符求长度为m的组合时,可以分解为第一个字 ...
最新文章
- DCIC 2021数据挖掘新赛题开放!
- HGST:中国将成为新云端运算大国
- [专题总结]AC自动机
- 只需三分钟!教会你如何选购及维护UPS蓄电池?
- 如何搭建MGRE——实验
- linux 下共享库创建及使用
- 不擅演讲的马化腾在 08 年讲了什么?
- 全球首富贝索斯离婚第二天 出轨对象女主播宣布离婚...
- 响应式滚动图懒加载 element ui el-carousel 组件优化代码
- filter:alpha(opacity=100,style=1)
- Learn OpenGL(五)——定义自己的着色器
- 学习之法 —— 如何阅读代码、如何编写代码
- UIButton常用属性
- 第一代计算机硬件逻辑主要采用,第一代计算机的硬件逻辑主要采用电子管,程序设计语言采用BASIC语言...
- 汉庭加盟:连锁酒店影视房的市场分析
- 弘辽科技:拼多多DSR动态评分有多么的重要
- Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
- java统计误码率_MATLAB通信工具箱来计算误码率
- model 和WEB前台页面提交完美自动填充
- Pandas数据分析14——pandas数据框的多层索引