【CC150】字符串的全排列组合之递归法

题目说明:编写一个方法,确认某字符串的所有排列组合。

方法1:见上一篇文章https://www.cnblogs.com/dfglind/articles/13504336.html

方法2:使用递归+回溯方法

思路:

1.回溯,顾名思义往回翻,回到上一个状态。只有共享同一个空间才需要回溯。

2.递归,可以把一个问题给拆分成若干子问题,交给“小弟”去完成。

本题里每两个元素交换,形成新的组合时,就可以用递归完成

 

图中,K 表示当前位置,纵向递归完成,交由一个一个“小弟”来做事,横向循环遍历字符串,使得每位都放在第一位。

理解先走完递归在走循环很重要。这样输出的一定时按顺序的,先走完a开头的,在走b开头的,在走c开头的。

这涉及到顺序,就不可以用集合了,在这里使用ArrayList。所以就要解决重复的问题。这里使用一个判断函数。

如果不能很好的理解递归,建议debug一下,你能看到k的变化和每生成一个新的组合的变化。

代码如下:

 1 public class case8_permutation2回溯 {
 2     static ArrayList<String> res=new ArrayList<>();
 3     public static void main(String[] args) {
 4         //ArrayList<String> res=case8_permutation2回溯.getpermutation("aaaba");
 5         //ArrayList<String> res=case8_permutation2回溯.getpermutation("aab");
 6         //ArrayList<String> res=case8_permutation2回溯.getpermutation("aabc");
 7         ArrayList<String> res=case8_permutation2回溯.getpermutation("abc");
 8         System.out.println(res.size());
 9         System.out.println(res);
10     }
11     //统一接口;
12     private static ArrayList<String> getpermutation(String str) {
13         char[] a=str.toCharArray();//转成数组是为了交换方便;
14         permutation(a,0);
15         return res;
16     }
17 
18 
19     private static void permutation(char[] a, int k) {
20         
21         if(k==a.length){//出口
22             res.add(new String(a));
23         }
24         
25         for (int i = k; i < a.length; i++) {
26             if(judge(a,k,i))continue;//如果将要交换的两元素相同,就直接进入下一次循环
27             swap(a,k,i);
28             permutation(a, k+1);
29             swap(a,k,i);
30         }
31     }
32     //判断是否有重复元素;
33     private static boolean judge(char[] a, int k, int i) {
34         for (int j = k; j < i; j++) {
35             if(a[j]==a[i])
36                 return true;
37         }
38         return false;
39     }
40     //交换数组中的元素;
41     private static void swap(char[] a, int k, int i) {
42         char temp=a[i];
43         a[i]=a[k];
44         a[k]=temp;
45     }
46 
47 }

以上代码输出:

6
[abc, acb, bac, bca, cba, cab]

 

posted on 2020-08-14 20:29  丁不煮  阅读(298)  评论(0)    收藏  举报

导航