题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
i表示当前交换位置,与从i开始的每一个进行交换,因为本身也是一种排列,所以起始是i=j ,举个例子
abc,首先i从0开始,a和a自己交换,abc,继续递归,直到abc这一分支递归完毕,此时必须交换回来,所以又加了一次swap,然后a和b交换,bac,继续递归,直到bac这一分支递归完毕,交换回来,字符串变回abc,然后a和c交换,cba,继续递归...
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<>();
if(str!=null && str.length()> 0){
PermutationHelper(str.toCharArray(),0,res);
Collections.sort(res);
}
return res;
}
public void PermutationHelper(char[] str,int i,ArrayList<String> list){
if(i == str.length -1 && !list.contains(String.valueOf(str))){
list.add(String.valueOf(str));
}else{
for (int j = i; j < str.length; j++) {
swap(str, i, j);
PermutationHelper(str, i+1, list);
swap(str, i, j);
}
}
}
public void swap(char[] c,int i,int j){
char t = c[i];
c[i] = c[j];
c[j] = t;
}
}