1. 字母全排列
2.
3. 首先可以看出,全排列其实就是阶乘,3个字母会有3阶乘种表现,4字母会有4阶乘种
4. 上面fat的变化是有规律的 ,我们要得到全排列的做法是: 将三个字母分别作为开头,然后
5. 调整除了第一个字符之外的位置,即fat 将后两个调整 fta
6. 当有4个字母时,如golf,那么分别让g,o,l,f打头,当g打头是后面是olf,那就可以回到上面fat的例子
7. 这就是递归的表现,4个字母是四种字母打头的后面是3的全排列,3个字母又是3种字母打头的后面是2的全排列 就像第一行所示
8.
9. 其实递归就是一种封装,一种面向对象,或者说是面向责任。。。所以递归责任链中的每一个职责执行者标识符肯定有区别。。。。这里的标识符就是 start...而且在递归中最后一个责任执行者所做的事情与前面的人做的完全不一样,所以需要判断是否是最后一个执行者。。。。。
10.
11. //每一级所做的事情:使得char[]中的每个元素都充当首元素
12. //传递规则: 把除了首字母的char[]传递下去
13. //归的条件: 如果全部搞完,则重头到尾打印一次
14.
15.
16. 什么叫全排列。。。其实就是要得到全部的结果,而不是一个结果,从技术角度说,一次递归只可能得到一个结果,但是这里在递归中有循环,也就意味着有分支了。。所以这样可以造成多个结果,与倒油问题不同,这里每一次数组都会递减。。。而倒油问题的油桶每一次都是一样的。。。。。
17.
18. public static void main(String[] args) {
19.
20. String string = "123";
21. doAnagram(string.toCharArray(), 0, string.length() - 1);
22. }
23.
24. public static void doAnagram(char[] c, int start, int end) {
25. char temp;
26. if (start == end) {
27. for (int i = 0; i <= end; i++)
28. System.out.print(c[i]);
29. System.out.println();
30. } else {
31. for (int i = start; i <= end; i++) {
32. //把当前首元素与每个元素交换,使得每个元素都能充当首元素
33. temp = c[start];
34. c[start] = c[i];
35. c[i] = temp;
36. doAnagram(c, start + 1, end);
37. //因为当前元素被交换了,为了打印当前值,把交换的给交换回来
38. //注意:这里每一个都放到第一种位置有两种放发,第一种是:循环的把每个都放到头上,第二个是1,2交换,然后交换回来,然后1,3交换,然后交换回来,这样做的好处是不会打乱顺序,便于递归
39. temp = c[start];
40. c[start] = c[i];
41. c[i] = temp;
42. }
43. }
44. }
分享到:
相关推荐
标题 "五个字母全排列 .sql 数据库" 暗示我们正在处理一个 SQL 文件,它可能包含了一种特殊的数据结构,用于存储所有可能的五个字母的全排列组合。描述中的 "26个字母5个长度全排列" 确认了这一点,说明这个数据库...
本程序实现由数字1~N组成的全排列,由于使用了模板,因此仅改变需要排列的数据源,还可实现对任意给定字符、字符串或其他对象的全排列
全排列问题是一个经典的计算机科学问题,它涉及到对一组对象的所有可能排列进行枚举。在算法设计和分析中,通常会采用递归和回溯的方法来解决这类问题。本篇文章将深入探讨全排列问题,以及如何使用C++语言来实现。 ...
python python_leetcode题解之第784题字母大小全排列
在编程领域,字符串的全排列是一个经典的问题,它涉及到算法和数据结构的知识。在这个问题中,我们被要求找出一个字符串中所有可能的字符排列组合。这个任务通常可以通过回溯算法或者堆栈等方法来实现。这里我们将...
在编程领域,全排列是一个经典的算法问题,它涉及到如何生成一个序列的所有可能排列方式。当输入元素中存在重复时,处理全排列问题会变得更为复杂。C#作为.NET框架下的主要编程语言,提供了丰富的数据结构和算法支持...
常见得全排列有三种解决方案,for循环穷举,stl摸板函数next_permutation,还有DFS深度优先搜索,当我们遇到带有重复的字符串时应该考虑除去重复的部分。
题目9是带有位置约束的排列问题,要求A、B都在C的同侧,可以先不考虑约束,6个字母全排列有A66种,再考虑A、B相对于C的位置,由于左右两侧各三个位置,A、B可以在同一侧的3个位置中任选,因此总共有2 * A66种排列。...
例如,26个英文字母全排列的问题,它的排列数为26!≈4×10^26,即使是超高速电子计算机,也需要1.2×10^12年来完成这项工作。 算法分析研究的范畴是讨论算法的优劣好坏。这包括讨论算法需要多少计算时间和存储空间...
输出有重复字符的全排列,C++源码......
在计算机科学领域,全排列是组合数学中的一个重要概念,它指的是从n个不同元素中取出n个元素,按照一定的顺序排列的所有可能的方式。当n个元素的排列需要按照特定顺序,如字典序(从小到大的顺序)进行时,我们称之...
字典序是一种排序方式,用于按字母或数字的顺序对序列进行排序。在全排列中,字典序排列是指所有可能的排列按字典序排列后的序列。例如,序列{1, 2, 3}的全排列按字典序排列为{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, ...
简单的实现,代码很短。 输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。
这种算法常用于密码学、数据加密以及计算机科学中的各种组合优化问题,例如在处理含有重复字母的字符串时,找出所有可能的重组方式。 #### 知识点二:算法实现原理 在Java中实现重复元素全排列,通常采用递归的...
生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于100,其中包含重复的字符。 【输出形式】 向标准输出印...
组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法组合数学全排列换位算法
全排列是一种经典的算法问题,它涉及到了排列组合与递归的思想。给定一个字符串,全排列的任务是找出所有可能的字符顺序,其中每个字符都恰好出现一次。在本例中,字符串仅包含小写字母,并且长度在2到8之间。 解决...
输入一个n,然后产生n的一个随机全排列,并且运用这个随机全排列进行文件的加密,加密规则是字母的移位。
字典序排列是指按照字母表顺序或数字大小顺序生成所有可能的排列。在数字全排列中,这意味着从最小的排列开始,依次生成下一个更大的排列。例如,对于数字123,字典序排列会先生成123,然后是132,最后是213和231。...
字典序是一种排序规则,它将字符串视为字符的序列,并按照字母表顺序比较每个位置的字符来确定顺序。在这种情况下,我们首先排列序列的第一个元素,然后是第二个,以此类推,直到所有元素都被考虑过。 全排列算法...