class Solution {
List<String> res=new ArrayList();
char[] c;
public String[] permutation(String s) {
c=s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
public void dfs(int position){
if(position==c.length-1){
res.add(String.valueOf(c));
return;
}
HashSet<Character> set=new HashSet();
// 跟自己也要交换
for(int i=position;i<c.length;i++){
if(set.contains(c[i])){
continue;
}
set.add(c[i]);
// 不能这样写,如果是aabb,还是会重复。必须用set,把当前用过的都加进去。这样,a会跳过a,到第一个b,交换。dfs完
// 到第二个b时,a不会再与第二个b交换,防止重复
// if(i!=position&&c[i]==c[position]){
// continue;
// }
char temp=c[i];
c[i]=c[position];
c[position]=temp;
dfs(position+1);
temp=c[i];
c[i]=c[position];
c[position]=temp;
}
}
}
更新,Bug处理
class Solution {
List<String> res=new LinkedList();
char[] c;
public String[] permutation(String s) {
c=s.toCharArray();
dfs(0);
return res.toArray(new String[res.size()]);
}
public void dfs(int index){
if(index==c.length-1){
res.add(String.valueOf(c));
return;
}
HashSet<Character> set=new HashSet();
for (int i = index; i < c.length; i++) {
// 为了防止重复字母,(aabb)
if(set.contains(c[i]))
continue;
set.add(c[i]);
char temp=c[index];
c[index]=c[i];
c[i]=temp;
// 放后面,"suvyls" 有非常严重的bug,绝大多数样例是正确的,因为aa自己交换了也相当于什么都没干,
// 还是aabb想,但a第二次见到b时,先交换的话,现在因为第一个b在set里,导致这里
// 跳出了.但序列被改变为了baba,乱了。因此我们在之前判断,不能先交换
// if(set.contains(c[index]))
// continue;
// set.add(c[index]);
dfs(index+1);
temp=c[index];
c[index]=c[i];
c[i]=temp;
}
}
}