题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
public class Permutation {
/*
回溯法
思路:
把字符串分成2部分,第一部分只占一位,后面的为第二部分
让第一部分,与第二部的字符串交换位置(即找到第一位所有的可能)
固定第一位,把 同样的方法 作用于 第二部分
*/
ArrayList<String> res=new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if(str==null||str.length()==0)
return res;
backTrack(str.toCharArray(),0);
Collections.sort(res);
return res;
}
/*
* i表示让第几位与后面的字符们交换位置,然后固定第几位的字符
* 直到i==chars.length,代表整个字符串每一位的字符都固定了,这时判断字符串是否在res中,不在则加入到res中
* */
private void backTrack(char[] chars, int i) {
if(i==chars.length-1){
String str=String.valueOf(chars);
if(!res.contains(str)){
res.add(str);
}
}else{
for (int j=i;j<chars.length;j++){
if(j==i||chars[i]!=chars[j]){
swapChar(chars,i,j);
//注意:这里递归调用的参数应该是i+1,固定i后面的字符
backTrack(chars,i+1);
swapChar(chars,i,j);
}
}
}
}
private void swapChar(char[] chars, int i, int j) {
char c=chars[i];
chars[i]=chars[j];
chars[j]=c;
}
}