博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串的排列组合问题--
阅读量:6253 次
发布时间:2019-06-22

本文共 1839 字,大约阅读时间需要 6 分钟。

hot3.png

问题1:输入一个字符串,打印该字符串中字符的所有排列,例如输入字符串abc,则输出由字符abc所能排列出来的所有字符串abcacbbacbcacabcba

思路:这是个递归求解的问题。递归算法的四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解能组合成整个问题的解。

对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n个元素的全排列。对于只有1个元素的集合,可以直接生成全排列。全排列的递归终止条件很明确,只有1个元素时。下面这个图很清楚的给出了递归的过程。

06111814_lszz.gif
参考代码:解法1通过Permutation_Solution1(str,0,n)(Permutation置换;排列);解法2通过调用Permutation_Solution2(str,str)来求解问题。

//函数功能:求一个字符串某个区间内字符的全排列//函数参数:pStr为字符串,begin和end表示区间//返回值:无void Permutation_Solution1(char *pStr,int begin,int end){    if(begin == end-1)//只剩一个元素    {      for(int i=0;i
问题2:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

思路:同样是用递归求解。可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被选中,如果被选中,递归求解C(n-1, m-1)。如果未被选中,递归求解C(n-1, m)。不管哪种方式,n的值都会减少,递归的终止条件n=0或m=0。

//函数功能 : 从一个字符串中选m个元素//函数参数 : pStr为字符串, m为选的元素个数, result为选中的//返回值 :   无void Combination_m(char *pStr, int m, vector
&result){ if(pStr == NULL || (*pStr == '\0'&& m != 0)) return; if(m == 0) //递归终止条件 { for(unsigned i = 0; i < result.size(); i++) cout<
result; Combination_m(pStr, i, result); }}
问题3:打靶问题。一个射击运动员打靶,靶一共有10环,连开10 枪打中90环的可能性有多少?

 思路:这道题的思路与字符串的组合很像,用递归解决。一次射击有11种可能,命中1环至10环,或脱靶。

//函数功能 : 求解number次打中sum环的种数//函数参数 : number为打靶次数,sum为需要命中的环数,result用来保存中间结果,total记录种数 //返回值 :   无void ShootProblem_Solution1(int number, int sum, vector
&result, int *total){ if(sum < 0 || number * 10 < sum) //加number * 10 < sum非常重要,它可以减少大量的递归,类似剪枝操作 return; if(number == 1) //最后一枪 { if(sum <= 10) //如果剩余环数小于10,只要最后一枪打sum环就可以了 { for(unsigned i = 0; i < result.size(); i++) cout<
<<' '; cout<
<
result; ShootProblem_Solution1(number, sum, result, &total); cout<<"total nums = "<
<

转载于:https://my.oschina.net/u/347414/blog/150436

你可能感兴趣的文章
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
计算机网络与Internet应用
查看>>
Mars说光场(3)— 光场采集
查看>>
Django 文件下载功能
查看>>
走红日本 阿里云如何能够赢得海外荣耀
查看>>
HTML DOM 之 DOM对象:Document Object Model (文档对象模型)
查看>>
qt 学习之路2
查看>>
算法分析-快速排序QUICK-SORT
查看>>
线上应用故障排查之二:高内存占用
查看>>
第四次作业
查看>>
异常处理汇总 ~ 修正果带着你的Code飞奔吧!
查看>>
百度地图需要的效果-有感
查看>>
BZOJ 1853: [Scoi2010]幸运数字
查看>>
BFS --- 素数环
查看>>
PCIE_DMA:xapp1052学习笔记
查看>>
给报表增加页眉
查看>>
python ----字符串基础练习题30道
查看>>
K 班1-7,alpha,beta 作业成绩汇总
查看>>
uva-10879-因数分解
查看>>
python 调用aiohttp
查看>>