输入一个字符串,按字典序打印出该字符串中字符的所有排列(剑指offer)
参考链接:https://blog.csdn.net/Felix_ar/article/details/84038226
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<String>();
if(str != null && str.length() > 0){
process(str.toCharArray(), 0, res);
Collections.sort(res);//最后的排序,以保证为字典序
}
return res;
}
public void process(char[] str, int i, ArrayList<String> list){
if(i == str.length-1){
String val = String.valueOf(str);
if(!list.contains(val)){
list.add(val);
}
}else{
for(int j=i; j<str.length; j++){
swap(str,i,j);//交换当前位置与后面的每一个位置上的字母,图中的1,2,4,7走的都是这个swap
process(str, i+1, list);
swap(str,i,j);//因为走到这一步就代表整上面的语句return了,也就是确定了一种排列,只要是确定了排列,那么,我们应该回到确定排列之前的状态,也就是交换回来;为了便于理解,就上面的图,图中的3,5,6走的就是这个swap
}
}
}
public void swap(char[] str,int i,int j){
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}