`

题目------字母全排列

阅读更多

字母全排列

首先可以看出,全排列其实就是阶乘,3个字母会有3阶乘种表现,4字母会有4阶乘种
上面fat的变化是有规律的 ,我们要得到全排列的做法是: 将三个字母分别作为开头,然后
调整除了第一个字符之外的位置,即fat 将后两个调整 fta 
当有4个字母时,如golf,那么分别让g,o,l,f打头,当g打头是后面是olf,那就可以回到上面fat的例子
这就是递归的表现,4个字母是四种字母打头的后面是3的全排列,3个字母又是3种字母打头的后面是2的全排列 就像第一行所示

其实递归就是一种封装,一种面向对象,或者说是面向责任。。。所以递归责任链中的每一个职责执行者标识符肯定有区别。。。。这里的标识符就是start...而且在递归中最后一个责任执行者所做的事情与前面的人做的完全不一样,所以需要判断是否是最后一个执行者。。。。。

//每一级所做的事情:使得char[]中的每个元素都充当首元素
//传递规则: 把除了首字母的char[]传递下去
//归的条件: 如果全部搞完,则重头到尾打印一次


什么叫全排列。。。其实就是要得到全部的结果,而不是一个结果,从技术角度说,一次递归只可能得到一个结果,但是这里在递归中有循环,也就意味着有分支了。。所以这样可以造成多个结果,与倒油问题不同,这里每一次数组都会递减。。。而倒油问题的油桶每一次都是一样的。。。。。

 public static void main(String[] args) {

	        String string = "123";
	        doAnagram(string.toCharArray(), 0, string.length() - 1);
	    }

	    public static void doAnagram(char[] c, int start, int end) {
	        char temp;
	        if (start == end) {
	            for (int i = 0; i <= end; i++)
	                System.out.print(c[i]);
	            System.out.println();
	        } else {
	            for (int i = start; i <= end; i++) {
                    //把当前首元素与每个元素交换,使得每个元素都能充当首元素
	                temp = c[start];  
	                c[start] = c[i];
	                c[i] = temp;
	                doAnagram(c, start + 1, end);
       //因为当前元素被交换了,为了打印当前值,把交换的给交换回来
       //注意:这里每一个都放到第一种位置有两种放发,第一种是:循环的把每个都放到头上,第二个是1,2交换,然后交换回来,然后1,3交换,然后交换回来,这样做的好处是不会打乱顺序,便于递归               
                            temp = c[start];
	                c[start] = c[i];
	                c[i] = temp;
	            }
	        }
	    }

分享到:
评论

相关推荐

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。 输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    字典序全排列

    算法课写的小程序,在字典序下对输出序列的全排列

    leetcode中国-LeetcodeSolution:LeetCode题目-Java解法(持续更新)

    leetcode题目解法(持续更新) 题号 名称 类型 1 两数之和 array 5 最长回文子串 dynamic programming 6 Z 字形变换 string 8 字符串转换整数 (atoi) string 11 盛最多水的容器 double pointer 15 三数之和 array 16...

    javalruleetcode-leetocode:leetcode解题记录

    题目 题解 022-旋转图像 023-全排列 024-字母异位词分组 025-最大子序和 026-跳跃游戏 027-合并路径 029-最小路径和 030-爬楼梯 031-编辑距离 032-颜色分类 033-子集 034-单词搜索 035-二叉树的中序遍历 036-不同的...

    leetcode跳跃-leetcode:leetcode

    leetcode 跳跃 leetcode 介绍 leetcode刷题记录() 1. 题目汇总 3.无重复字符的最长子串----滑动窗口 4.(hard)寻找两个有序数组的中位数----分治 5.最长回文子串----...46.全排列----回溯 48.旋转图像----数组变换

    python求一个字符串的所有排列的实现方法

    题目描述: 设计一个程序,当输入一个字符串时,要求输出这个字符串的所有排列。 例如输入字符串 abc,要求输出由字母 a、b、c 所能排列出来的所有字符串 abc,acb,bac,bca,cab,cba。 方法:递归法 以字符串 ...

    Java实现蓝桥杯凑算式(全排列)

    这个算式中AI代表19的数字,不同的字母代表不同的数字。 比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。 这个算式一共有多少种解法? 注意:你提交应该是个整数,不要填写任何多余的内容或说明...

    leetcode单词接龙2-LeetCode:力码

    推荐题目列表 第一周题目列表 1两数之和 21合并两个有序链表 26删除排序数组中的重复项 42接雨水 66加一 88合并两个有序数组 189旋转数组 283移动零 第二周题目列表: 1.两数之和 49.字母异位词分组 94.二叉树的中序...

    leetcode答案-leetcode:LeetCode问题的解决方案

    组合与全排列相关题目 组合总和 组合总和 II 全排列 全排列 II 子集 子集 II 二叉树的遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树的后序遍历 位运算相关 对于任意数字 n ,将 n 和 n−1 做与运算,会把最后一个 ...

    leetcode答案-leetcode:leetcode

    题目编号。 0129- L1,L2 链表 移除链表元素:L203 移除数据中的元素:L27 2 快慢指针: L18 删除倒数第N个节点。 链表是否有环 双指针 L11 成最多水的容器。167. 两数之和 II - 输入有序数组。 L977有序数组的平方 3...

    leetcode跳跃-LeetCode:LeetCode刷题打卡

    字母大小写全排列 回溯算法 64 ms 13.5 MB 2020.02.05 数组 编号 难度 题目 题解思路 执行结果 1 简单 两数之和 [1] 暴力法[2] 两遍哈希表 [1] 7608 ms 14.2 MB[2] 56 ms 14.9 MB 11 中等 盛最多水的容器 [1] 暴力法...

    leetcode答案-LeetCode:LeetCode上一些题的答案,虽然可能不是最优的答案,但是已经通过测试用例

    大家好,这是我的LeetCode代码仓,里面是我LeetCode上做的一些题的答案,虽然可能不是最优的答案,但是已经通过测试用例,所有题目都使用Java语言解答,希望可以和各位一起学习交流。 目录 题号 题名 难度 解答 1 两...

Global site tag (gtag.js) - Google Analytics