【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]
浙公网安备 33010602011771号