给定任意字符序列,类似“123456”、“qxklt”,输出全部的排列组合

题目

给定任意字符序列,类似“123456”、“qxklt”,输出全部的排列组合

根据数学知识,我们知道是字符长度的阶乘,比如,“123456”是6!=720。
拿到这个题,首先确定不能是字符长度个for循环,比如,上面就有6个for循环嵌套,如果别人给100个数字了。。。
所以想到了递归,下面是代码实现。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.kevinlsui.test;
import java.util.LinkedList;
import java.util.List;
/**
* 给定任意字符序列,类似“123456”、“qxklt”,输出全部的排列组合
*/
public class Test {
static int count = 0;
public static void main(String[] args) {
//任意字符序列,类似“123456”、“qxklt”,输出全部的排列组合
String str = "123plh";
List<Character> list = split(str);
//初始调用递归
digui(list,"",str.length());
System.out.println("排列组合的个数"+count);
}
/**
* 递归方法
* 第一个参数是待选择元素数组,第二个参数是已经排序的序列,第三个参数是初始字符长度,为了判断是否完成递归
* @param arr
* @param str
* @param size
*/
public static void digui(List arr,String str,int size){
if(str.length() == size){//递归出口
System.out.println(str);
count++;
}else{
//核心代码
for(int i = 0 ; i < arr.size();i++){
//循环过程不能删除循环体中的元素,所以新建一个临时list,同时选用LinkedList,删除效率更高
List temp = new LinkedList(arr);
digui(temp,str+temp.remove(i),size);//数组去掉一个字符,序列添加上该字符,下一轮递归
}
}
}
/**
* 字符串转list
*/
public static List split(String str){
List<Character> list = new LinkedList<>();
for(int i = 0 ; i < str.length();i++){
list.add(str.charAt(i));
}
return list;
}
}
文章目录
  1. 1. 题目
  2. 2. 代码实现
|