问题:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路://回溯法
//第1个数和第1个数交换,第1个数和第2个数交换,以此类推
//第1个数确定位置之后,第2个数与第2个数交换,第2个数与第3个数交换,以此类推
//第2个数确定位置之后,第3个数与第3个数交换,第3个数与第4个数交换,以此类推
//递归的出口是当确定到 倒数第2个数时最后1个数自然就确定了,然后添加到list内,return返回。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Solution {
public ArrayList<String> Permutation(String str) {
List<String> list = new ArrayList<String>();
if(str.length()==0)
return (ArrayList) list;
recursionTree(str.toCharArray(), list, 0);
Collections.sort(list);
return (ArrayList)list;
}
public void recursionTree(char[] ch, List<String> list, int i){
if((i==ch.length-1) && (!list.contains(new String(ch)))){
list.add(new String(ch));
return ;
}
for(int j=i; j<ch.length; j++){
swap(ch, i, j);
recursionTree(ch, list, i+1);
swap(ch, i, j);
}
}
public void swap(char[] ch, int i, int j){
if(i!=j){
char flag = ch[i];
ch[i] = ch[j];
ch[j] = flag;
}
}
}