package niuke;
import java.util.ArrayList;
import java.util.Collections;
public class Arraylist {
public static void main(String[] args) {
System.out.println(Permutation("bca"));
}
//字符串的排列
/*输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。*/
public static ArrayList<String> Permutation(String str) {
ArrayList<String> al = new ArrayList<>();
char[] c = new char[str.length()];
c = str.toCharArray(); //把字符串转化为字符数组,便于进行操作
PermutationHelper(c,0,al); //从数组的第一个元素启动转换,进入递归的操作开始
Collections.sort(al); //这种排序方法就能实现按照字典排序的情况了
return al;
}
private static void PermutationHelper(char[] c, int i, ArrayList<String> al) {
// TODO Auto-generated method stub
if( i == c.length - 1 ) { //当已经是最后一个元素,此时已经交换完毕,这时就可以添加了
if(!al.contains(String.valueOf(c)))
al.add(String.valueOf(c)); //利用String类的valueof函数把数组转化为字符串类型添加到al中
}else {
for(int j = i ; j < c.length ; j ++) { //从第i个元素使其不断与后面的元素交换,就得到别的情况了,相当于后面的元素轮流坐在i的位置上,然后把当元素坐在i位置上之后,以后的所有情况就是i+1了。
swap(c,i,j); //交换的部分
PermutationHelper(c, i + 1, al); //想当于第i个元素固定,从第i+1个元素开始,运用递归得到所有情况。就是后面所有的元素都坐在就是j,都坐在i的位置上,然后i+1再去考虑以后的情况。
swap(c,i,j); //交换回去不影响原来的顺序,否则结果会出现问题
}
}
}
private static void swap(char[] c, int i, int j) {
// TODO Auto-generated method stub
char temp = c[i];
c[i] = c[j];
c[j] = temp;
}
}