可能会出现重复字符,所以先排序,拍完后重复的字符就会相邻
去重:如果当前字符跟前一个相同且前一个字符还没有被用过,这个时候就会有重复,所以continue
class Solution {
List<String> res = new ArrayList<>();
public String[] permutation(String s) {
char[] arr = s.toCharArray();
Arrays.sort(arr);
backtarcking(arr, new boolean[arr.length], new StringBuilder());
String[] ret = new String[res.size()];
for(int i = 0; i < res.size(); i++){
ret[i] = res.get(i);
}
return ret;
}
public void backtarcking(char[] charsArr, boolean[] visited, StringBuilder sb){
if(sb.length() == charsArr.length){
res.add(sb.toString());
return;
}
for(int i = 0; i < charsArr.length; i++){
if(visited[i]){
continue;
}
// 如果当前字符跟前一个相同且前一个字符还没有被用过,这个时候就会有重复,所以continue
if(i != 0 && charsArr[i] == charsArr[i - 1] && visited[i - 1] == false) continue;
visited[i] = true;
sb.append(charsArr[i]);
backtarcking(charsArr, visited, sb);
sb.deleteCharAt(sb.length() - 1);
visited[i] = false;
}
}
}