和数字的全排列有相似点
回溯
这里把字符串非为两部分:前部分固定,和后面全部进行一次交换
class Solution {
List<String> res = new ArrayList<String>();
char[] ch;
public String[] permutation(String s) {
ch=s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
void dfs(int x){
if(x==ch.length-1){
res.add(String.valueOf(ch));
return;
}
HashSet<Character> set = new HashSet<>();
for(int i = x;i<ch.length;i++){
if(set.contains(ch[i])){
continue;
}
set.add(ch[i]);
swap(i,x);
dfs(x+1);
swap(x,i);
}
}
void swap(int a,int b){
char temp = ch[a];
ch[a] = ch[b];
ch[b] = temp;
}
}