题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
https://blog.csdn.net/zjxxyz123/article/details/79709240
回溯:交换位置
遍历: for
去重: HashSet 如果当前位置的元素出现过那么一定加载到hashSet里面了 就代表重复出现过
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> list = new ArrayList<>();
if(str.length() == 0)
return list;
char[] ch = str.toCharArray();
help(list, ch, 0);
Collections.sort(list);
return list;
}
public void help(ArrayList<String> list, char[] ch, int i ){
if(i == ch.length){
list.add(new String(ch));
return;
}
HashSet<Character> set = new HashSet<>();
for(int j = i; j < ch.length; j++){
if(!set.contains(ch[j])){
set.add(ch[j]);
swap(ch, i, j);
help(list, ch, i+1);
swap(ch, i, j);
}
}
return;
}
public void swap(char[] ch, int i, int j){
char t = ch[j];
ch[j] = ch[i];
ch[i] = t;
}
}