字符串全排列

题目:终端随机输入一串字符串,输出该字符串的全部排列。java

  例如,输入:“abc”,输出:abc、acb、bac、bca、cab、cba算法

【解决思想与办法】函数

  正常人的思惟是,固定第一个字符,而后依次将后面的字符串与前面的交换,那么排列的个数就是除了第一个字符之外,其余字符的排列个数+1。也就是固定一个字符以后,再将问题变小,只须要求出后面子串的排列个数就能够得出结果,固然第一时间想到的就是递归的算法了。下面这张图很清楚的给出了递归的过程:测试

  

  很明显,递归的出口,就是只剩一个字符的时候,递归的循环过程,就是从每一个子串的第二个字符开始依次与第一个字符交换,而后继续处理子串。还有一点就是可能会有重复数据,有人可能会采起向下比较策略即在交换以前作一次比较查看这两个值是否同样,我以为大可没必要,大不了有重复的,存放这些结果的容器选用HashSet便可,这样不只下降了程序的复杂度也能提高必定的程序效率,何乐而不为呢!spa

【关键词提示】

  permutation  [pɜːmjʊ'teɪʃ(ə)n]   排列,置换        recursion   [rɪ'kɜːʃ(ə)n]   递归,循环 code

具体代码参看以下:blog

 1 import java.util.ArrayList;
 2 import java.util.HashSet;
 3 import java.util.Scanner;
 4 
 5 public class RecursionPermutation {
 6     public static ArrayList<String> result = new ArrayList<String>();
 7     public static HashSet<String> set = new HashSet<String>();
 8     /**
 9      * 主函数入口
10      * @param args
11      */
12     public static void main(String[] args) {
13         System.out.println("请随意输入一串字符串:");
14         String inputString = new Scanner(System.in).next().toString();
15         ArrayList<String> result = Permutation(inputString);
16         for (int i = 0; i < result.size(); i++) {
17             System.out.println(result.get(i));
18         }
19     }
20 
21     /**
22      * 递归函数主入口
23      * @param str
24      * @return
25      */
26     public static ArrayList<String> Permutation(String str) {
27         if (str == null || str.length() == 0)
28             return result;
29         else
30             Permutation(str, 0, str.length() - 1);
31         result.addAll(set);
32         return result;
33     }
34 
35     /**
36      * 递归条件函数
37      * @param str
38      * @param start
39      * @param end
40      */
41     public static void Permutation(String str, int start, int end) {
42         char[] array = str.toCharArray();
43         String r = null;
44         if (start == end) {
45             r = String.valueOf(array);
46             set.add(r);
47         } else {
48             for (int i = start; i <= end; i++) {
49                 char tmp = array[start];
50                 array[start] = array[i];
51                 array[i] = tmp;
52 
53                 Permutation(String.valueOf(array), start + 1, array.length - 1);
54 
55                 tmp = array[start];
56                 array[start] = array[i];
57                 array[i] = tmp;
58             }
59         }
60     }
61 

  以上代码都在本机测试验证经过,绝对保证无误!!!递归

相关文章
相关标签/搜索