基础算法设计-递归篇(一)

##前言 作为一个大一大二还没有感觉当时学的数据结构以及操作系统多重要的人,在大三想找暑期实习的时候,总算是感觉到了紧迫,趁着这学期还有一门算法课,特地将所有的题目以及思路尽量的记录下来(貌似有些多,但都是基础而且喜欢考的东西奥)。本篇是递归开始,说实话一开始我接触也是花了一些时间去理解,做得多了才能感受到其实递归算是比较简单的了。记住,当需要重复做一件事情的时候,调用同一个方法去执行,这时候可以考虑使用递归。 **注:题目来自我们亲爱老班的OJ,若觉有不妥之地请务必联系我,我可以立马收起来......** #递归(解决字母排序重复问题) ##例题一: ###题目描述 有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。 ###输入 第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。 ###输出 按字母升序顺序输出所有排列(每个排列占一行) ###样例输入 >4 acac ###样例输出 >aacc acac acca caac caca ccaa 先来讲讲这题的思路。首先可以**确保升序输出,就是对该数组进行排序**。 而后我的思路是**将每一个值,都放到第一个位置一次**,这里就需要一个循环去执行。然后你会发现其实第二数也跟我前面的想法一样,**让后面的值都来到第二个位置一次,这样重复的思路**,就**可以用递归**去实现这题。 之后怎么去避免重复的问题呢?其实一开始我是有想过将所有的结果都存到HashMap中,然后再对结果进行查重。但是这样的时间和空间的代价就大了。那么有没有可能我们**在执行这个递归的时候就排除掉重复**的可能呢? 我们看一下这些值,其实会发现,当一列中一个值出现重复的时候,你**只用确保这个值在第一个位置只出现一次,如果下次循环发现该值已经到过第一个位置,就不执行。**第二个位置的想法也是一样的,如果确定这个值已经到过第二个位置,则不再执行,以此类推。 可能我的表述还是不够清楚,也行代码可能很好的解决我们沟通的问题,嘿嘿。 ###大胆的做法(想法) ``` import java.util.Arrays; public class Test{ char[] A;//这里用字符串数组也是可以的,下面我会演示我一个不成熟的版本 public Test(){ A = "acac".toCharArray(); Permute(0); } private void Permute(int index){ //这个index是当前交换位置的下标 if(index>=A.length){ //临界条件,这里每一个符合条件的数直接输出 System.out.println(String.valueOf(A)); return; //这个不要漏了,漏了会gg的 } char last='$'; //创建一个临时值,记录上一次的值。 for(int i=index;i

你可能感兴趣的:(基础算法设计-递归篇(一))