首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
admin
2019-03-29
188
问题
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串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://www.kaotiyun.com/show/0RmZ777K
0
程序员面试
相关试题推荐
Notuntilthe1980’s______inBeijingstarttofindwaystopreservehistoricbuildingsfromdestruction.
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符’*’移到串的前部分,前面的非’*’字符后移,但不能改变非’*’字符的先后顺序,函数返回串中字符’*’的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函
设置邮件发送于30天之前那么隐藏邮件。
创建一个新的邮件。
Word的样式是一组巳命名的字符和()格式的组合。
在字体对话框中不能设置()A.字体B.字号C.字符间距D.文字样式
在foxpro中,要浏览多个数据库的字段,以下说法中正确的是()并允许进行字段的修改。A.使用listfields命令 B.browsefields命令C.前两者都不对 D.不能在command命令窗口中实现
改错题【要求】1)打开“T盘”中“P2vbp”文件,按参考界面形式编辑窗体界面,改正程序中的错误后,直接保存所有文件;2)改错时,不得增加或删除语句,但可适当调整语句位置。【题目】本程序的功能是生成由n(n通过InputBox函数输入)个3位升序
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
随机试题
患儿,男,9岁。水肿、血尿10天,进行性少尿8天。10天前晨起发现双颊水肿,尿发红,8天前尿色变浅,但尿量进行性减少。查体:体温36.9℃,呼吸24次/分,血压145/80mmHg。发育正常,营养中等,重病容。化验:尿蛋白(++),镜检白细胞(+)/HP,
加碘预防地方性甲状腺肿是易感者注射乙肝疫苗
颗粒不够干燥或药物易吸湿会引起( )。颗粒粗细相差悬殊或颗粒流动性差时会产生( )。
关于颈丛阻滞,哪一项是错误的?()
财务顾问业务的监管主体有()
如果不考虑影响股价的其他因素,零增长股票的价值与市场利率成正比,与预期股利成反比。()
下列关于互斥项目排序的表述中,错误的是()。
下列选项中,不会引起收入水平的上升的是()。
简述汉武帝加强中央集权的主要措施。
HowtoStartaSmallBusinessintheUSPeoplefromothercountriesoftentakeAmericaasthe"landofopportunity".America
最新回复
(
0
)