- 题目
输入一个字符串,打印出该字符串中字符的所有排列。
- 示例
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
- 代码
class Solution {
List<String> res = new ArrayList<>();
StringBuilder cur = new StringBuilder();
// 用于判重
HashSet<Integer> set = new HashSet<>();
public void dfs(char[] s) {
int n = s.length;
if (n == cur.length()) {
res.add(cur.toString());
return;
}
for (int i = 0; i < n; i++) {
// 不同层判重,之前的某层用过了,就不用了
if (set.contains(i)) {
continue;
}
// 同层判重,如果有和这个点相同的点,并且相同的点用过,就不用了
if (i-1 >= 0 && s[i-1] == s[i] && set.contains(i-1)) {
continue;
}
int length = cur.length();
cur.append(s[i]);
set.add(i);
dfs(s);
cur.setLength(length);
set.remove(i);
}
}
public String[] permutation(String s) {
char[] chars = s.toCharArray();
Arrays.sort(chars);
dfs(chars);
int n = res.size();
String[] ans = new String[n];
for (int i =0; i < res.size(); i++) {
ans[i] = res.get(i);
}
return ans;
}
}