1.问题描述:
输入一个字符串,输出该字符串的全部全排列集合
2.思路描述:我们先从简单的例子开始考虑:假如输入的字符串为 ABC
我们先考虑A,可以在A的所有空位上添加上当前元素B,可以得到 {BA,AB},对得到的字符串集合再进行添加当前元素那么可以在BA的所有空位上添加元素,得到的集合为{ CBA,BCA,BAC} 在AB的所有空位上添加元素得到的集合为{ CAB,ACB,ABC}
那么就得到了ABC的全部全排列,那么多个字符的处理也是一样的,思路与上面的一样。思路有了,我们需要对上一次得到的集合进行临时的存储,而且需要创建两个list,一个是在初始化的时候创建,另外一个是在for循环里面创建(临时存储的作用),for循环遍历的是原来就已经存在集合,我们需要在遍历的时候往原来的集合中添加元素,然后把添加好元素的集合赋值给原来的下次下一次才可以正确遍历。
其中需要解决的问题是:如何在空位上添加当前元素,在最外层的for循环中表示的是当前需要添加的字符,里面遍历原来的旧的集合,并且在循环中创建一个一个list来保存当前添加新元素的集合,最终把新的集合赋值给旧的集合,遍历之后就需要往空位上添加字符,因为空位上存在多个,所以使用一个for循环,这里使用到了拼接字符串的方法:substring(index)和substring(firstIndex,lastIndex)方法
substring(index)方法可以截取从index到字符串结尾的字符串
substring(firstIndex,lastIndex):截取的字符串为从firstIndex ~ lastIndex - 1索引之间的字符串,所以不包括lastIndex这个字符
当firstIndex = = lastIndex的时候截取字符串的字符串为空
代码中还使用到了对list元素进行排序的方法:Collections.sort(需要排序的list) 去除字符串空格的方法:String对象的replaceAll()方法
3.具体的代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//去除字符串中的空格:trim()方法去除的是字符串前后的空格 replaceAll()方法是替换所有的空格
String str = sc.nextLine().replaceAll(" ", "");
List<String> list = solve(str);
System.out.println(list.size());//对集合中的元素进行排序
Collections.sort(list);
for(String strOuput : list){
System.out.println(strOuput);
}
}private static List<String> solve(String str) {
int n = str.length();
List<String> srcStr = new ArrayList<>();
if(n == 0){
return srcStr;
}
srcStr.add(str.charAt(0) + "");
for(int i = 1; i < n; i++){
List<String> strNew = new ArrayList<>();
for(String srcStr1 : srcStr){
for(int j = 0; j <= srcStr1.length(); j++){//n 个字符有n + 1的空格可以插入元素所以循环的长度为srcStr1.length() + 1
String str1 = srcStr1.substring(0, j) + str.charAt(i) + srcStr1.substring(j);
strNew.add(str1);
}
}
srcStr = strNew;
}
return srcStr;
}
}