给定一个全由小写字母构成的字符串,求它的全排列,按照字典序从小到大输出。
输入格式:
一行,一个字符串,长度不大于8。
输出格式:
输出所有全排列,每行一种排列形式,字典序从小到大。
输入样例:
在这里给出一组输入。例如:
abc
输出样例:
在这里给出相应的输出。例如:
abc
acb
bac
bca
cab
cba
解析:
可以先将输入的字符串按照全排列先排一遍,将结果存入一个容器中,然后对容器中的所有字符串进行排序
代码如下
import java.io.BufferedInputStream;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
String s=in.next();
char[] ar = s.toCharArray();
List<String> a= new LinkedList<String>();
a=Permutation(ar, 0);
Collections.sort(a);//对链表里的字符串进行排序,保证是字典序
for(String t : a) {
System.out.println(new String(t));
}
}
private static List<String> Permutation(char[] cs, int current) {
//结果
List<String> result = new LinkedList<>();
//当移动到最后一位时,把它转化为字符串存储在链表里
if (current == cs.length - 1) {
result.add(new String(cs));
} else {
for (int i = current; i < cs.length; i++) { //遍历字符串,使得每一个字符都能到第一个位置
swap(cs, current, i); //交换当前字符与下一字符
result.addAll(Permutation(cs, current + 1));//递归调用,第一个位置确定了,接下来就确定第二个位置,然后第三个...直到最后一位
swap(cs, current, i);//由于之前交换过一次,为了不重复,再交换过来
}
}
return result;
}
private static void swap(char[] cs, int b, int e) {
char tmp = cs[b];
cs[b] = cs[e];
cs[e] = tmp;
}
}