完成一个方法,返回一种排列组合的所有字符串结果的数目。排列组合的规则如下:
1)排列组合的的字符串由a~z 26个小写字母组成;
2)方法入参为每个字符串长度;
3)每个字符串中的后一个字符的字母顺序要大于前一个字符; 例如:abc 合法;bac、aac 不合法;
这个问题没有头绪,递归好像不好实现,望大家答疑解惑!
完成一个方法,返回一种排列组合的所有字符串结果的数目。排列组合的规则如下:
1)排列组合的的字符串由a~z 26个小写字母组成;
2)方法入参为每个字符串长度;
3)每个字符串中的后一个字符的字母顺序要大于前一个字符; 例如:abc 合法;bac、aac 不合法;
这个问题没有头绪,递归好像不好实现,望大家答疑解惑!
aac不行,说明不能重复
1~26个不重复
x=1,y=26
x=2,y=25+24+...+1
x=3,y=(24+23+...+1)+(23+22+...+1)+...(2+1)+1
...
x=26,y=1
两种思路,第一种不递归
用一个list,然后用循环把所有可能的字符串
例如x=4,则是aaaa,aaab,...baaa,baab,...zzzz全都枚举,并进行你上述的规则校验,校验通过就判断list中是否有了,没有就放进去,最后list的size就是结果。
第二种,递归
假设x=3,第一个字母有a~z(y和z经过校验不可以),然后取第二个字母,取第三个字母,每次取出字母都要符合你的规则,取完回到取第一个字母,依次,直到第一个字母取不出(假设字母是1~26,如果x=20,那么7也就是g是最后能取出的,h就取不出了)则递归结束,每取完一遍用计数器+1,递归完成时,计数器的数字就是结果。
上面的公式没写对。应该是这个
[url]http://baike.baidu.com/picture/2104972/2104972/0/6c63514aa4a6e77409f7efff?fr=lemma&ct=single [/url]
你只要的是数目,所以就是一个数学的排序组合问题。
可以这样理解:长度为N时结果就是从26个字母中取出N个不同字母的组合情况。因为按规则3来看N个不同字母最后的排列只能是一种情况“按字母大小排序”。
所以题目可以改为:
从26个小写字母中取出N个字母,然后按字母顺序进行排列。一共有多少种情况。
答案就是A(26,N)。26是下标,N是上标。根据数学公式,结果为
26*(26-1)*(26-2)*...*(26-N)
A(26,N)=------------------------------
(N*(N-1)*(N-2)*..*1
这个就是base36,换句话说就是36进制的数字
0,1,2.。。。9,a....z(z意思就是36)
各种语言基本都内置多进制支持,除了显式支持的2进制,8进制,16进制,基本都支持到62进制(0-9,a-z,A-Z)。
比如Integer.pareseInt(string,进制)-->Java里面
这样,你这个问题就是转换为下面的问题了:
输入给你一个多位数字,由几个单个数字构成
求由这几个数字构成的所有数字,要求高位比低位数字大。
这就是一个很简单的循环就能搞定的问题了。
求出所有数字后,转换为相应字符串即可。
我是这样认为的:
这个问题的本质实际上是树的路径遍历,原因是可以将问题结果作为树根,第一层为结果,第二层为所有可能的字母,第三层为对于每个可能的字母,顺序大于该字母的字母作为子节点.而树的高度+1则为字符串长度。比如假设只有abc三个字母 结果(a,b,c) ==> a(bc),b(c),c(NULL) 第二层 ==> ab(c) bc(NULL)。
使用递归的方式,显然是能够解决问题的,不再赘述,但是效率较低。 众所周知,树的路径遍历问题实际上是可以转化为循环方式的,方法如下:
使用一个队列,取名为Q;
第一步:ROOT ==> Q 作为初始化;
第二部:取Q的第一个元素(Q删除),取名为E
情况1:队列为空:结束程序;
情况2:sizeOf(E)即E包含的字母个数 = 输入长度+1 --------输出E
情况3:否则罗列所有大于Q的字母X, (E+X) ==>Q (E+X的目的是为了记住路径内容);
第三部:GOTO 第二步
也可以使用栈,区别是使用队列为广度遍历的方式,使用栈为深度遍历的方式,与递归比较类似。
这个应该是归结为一个数学问题吧?类似C(n, i)的结果?例如a,b,c,d,e中选择三个字符组成你所说的组合,其实最终的所有满足条件的组合数为:C(5,3)= (5*4*3)/(3*2*1) = 10.
不知道理解有误否。
相关推荐
也就是说,如果一个问题的最优解包含子问题的最优解,那么贪心算法才可能适用于这个问题。对于最优合并问题,可能需要分析合并操作是否满足这个性质,并进行相应的证明。 在实际应用中,贪心算法的性能可以通过时间...
学习《算法导论》的方法有很多,例如,遇到一个算法问题,可以在网上搜索相关资料,但是在阅读《算法导论》后,才会发现自己的问题都可以解决。同时,每学到一个算法,都可以将其总结一下,这样可以快速回忆和理解...
2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...
这是一个著名的NP完全问题,意味着没有已知的多项式时间算法可以解决所有规模的实例。 **C程序实现** 在提供的文件列表中,`tsp.c`很可能是旅行商问题的C语言实现。C语言是一种通用的、面向过程的编程语言,适用于...
算法不仅局限于数学计算,它广泛存在于日常生活中,如乐谱指导音乐演奏,菜谱指导烹饪,甚至简单的过河游戏也可以视为一个算法问题。 在"人教高中数学必修三 算法初步算法的概念教学"中,通过“狼、羊和蔬菜过河”...
贪心算法解决单源最短路径问题的基本思想是分步求出最短路径,每一步产生一个到达新目的顶点的最短路径。下一步所能达到的目的顶点通过贪婪准则选取,即选择路径最短的目的顶点。设置顶点集合S,并不断作贪心选择来...
1. **初始化种群**:随机生成一定数量的个体,每个个体表示一种可能的切割方案,长度表示材料的总长度,每个切割位置可以看作一个基因位点。 2. **计算适应度**:根据一维下料问题的需求,设计适应度函数。例如,...
在实际生产中,JSP并不总是要求得到精确解,因此有研究者使用近似算法在适当的时间内得到一个可接受的近似最优解来求解此问题,实际的计算表明,好的近似算法通常能在可接受的时间内得到与精确解相差甚小的近似解,...
城市旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问一个旅行商如何访问n个城市,每个城市仅访问一次,并返回起点,使得总旅行距离最短。这个问题是NP完全问题,没有已知的...
TSP是一个经典的组合优化问题,目标是找到一个最短的路径,使得旅行商能够访问给定城市列表中的每一个城市一次并返回起点。这个问题具有NP完全性,意味着在多项式时间内找到最优解是非常困难的。 描述中提到的智能...
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。每个个体实际上是染色体带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即...
TSP是一个著名的NP完全问题,其目标是在一个加权完全图中找到一条经过每个顶点一次且返回起点的最短闭合路径。在实际应用中,TSP广泛出现在物流配送、电路板布线等领域。由于问题的复杂性,通常采用启发式算法或近似...
网络优化问题的近似算法:网络优化问题在计算机科学和运筹学中是一个关键的研究领域,特别是在设计有效的算法以解决大规模网络中的问题时。近似算法作为解决优化问题的一种有效手段,能够在多项式时间内给出问题的...
在优化问题领域,旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题,它涉及到寻找最短的可能路线,使得一个旅行商能够访问每个城市一次并返回起点。这个问题是NP完全的,意味着没有已知的...
该算法的基本思想是:将背包问题分解成多个子问题,每个子问题的解决方案可以通过动态规划表来存储和查询。 在给定的代码中,动态规划算法的实现过程如下: 1. 首先,定义了物品的价值和质量数组 `v` 和 `w`。 2. ...
《算法问题实战策略》这本书是2015年2月出版的,主要涵盖了算法分析、设计、实战应用等多个方面的内容,对于想要深入理解和提升算法能力的读者来说是一份宝贵的资源。书中通过详细的目录结构,将内容划分为六个部分...
经典算法问题-TSP商旅问题(Traveling Salesman Problem),它是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的...
代码 改进蚁群算法求解连续空间优化问题代码代码 改进蚁群算法求解连续空间优化问题代码代码 改进蚁群算法求解连续空间优化问题代码代码 改进蚁群算法求解连续空间优化问题代码代码 改进蚁群算法求解连续空间优化...