首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
admin
2019-03-29
98
问题
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
选项
答案
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 string if(*pBegin == ’\0’) { printf("%s\n", pStr); } // otherwise, permute string else { for(char* pCh = pBegin; *pCh != ’\0’; ++ pCh) { // swap pCh and pBegin char temp = *pCh; *pCh = *pBegin; *pBegin = temp; Permutation(pStr, pBegin + 1); // restore pCh and pBegin temp = *pCh; *pCh = *pBegin; *pBegin = temp; } } }
解析
这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。
我们以三个字符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的排列。
既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。
转载请注明原文地址:https://kaotiyun.com/show/0RmZ777K
0
程序员面试
相关试题推荐
Notuntilthe1980’s______inBeijingstarttofindwaystopreservehistoricbuildingsfromdestruction.
Thecommitteehasanticipatedtheproblemsthat______intheroadconstructionproject.
YourfriendDavidjustsentyouabookthatyouexpectedasabirthdaypresent.Sendane-mailtohimtoexpressyourappreciati
ThepublicationofPM2.5datahasbecomeanationalhottopic.Theenvironmentinstituteplanstoholdarelevantlecture.AsC
Inthissection,youareaskedtowriteanessaybasedonthefollowinginformation.Makecommentsandexpressyourownopinion.
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/\610
如何通过ADO.NET读取数据库中的图片?
.asp.net如何实现MVC模式,举例说明!
类CMyString的声明如下:classCMyString{public:CMyString(char*pData=NULL);CMyString(constCMyString&str);~CMyString(void);
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
随机试题
大量咯血是指每天咯血量超过
A.面B.毛C.唇D.爪E.发“血之余”指的是
房屋租赁合同中,引起租赁纠纷的主要原因是()。
下列工作内容中,属于工程项目健康、安全、环保(HSE)管理体系实施和运行二级要素的有()。
经济增长指的是一个国家或一个城市的收入和产出的扩大,它可以用()的变动来衡量。
箱纸板主要用于运输包装。()
被撤销教师资格的,自撤销之日起5年内不得重新申请认定教师资格,其教师资格证书由市级以上人民政府教育行政部门收缴。()
除投资方向调节税之外,2009年下半年上海增收比例最大的税种是()。
A.beappropriateB.commentonC.sunnyweatherD.totheaudiencePhrases:A.youmaywantto【T13】______theirdisorganizedbo
下列排序方法中,最坏情况下比较次数最少的是
最新回复
(
0
)