1. 题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
Related Topics 回溯算法
👍 274 👎 0
2. 题解
2.1 解法1: 回溯(递归)
递归函数要点:
- 使用下标第多少位来控制递归终止
- 每次选取一个值后, 将其依次交换, 相当于在该位置选取不同的值
- 使用 set 记录该位置的元素, 若有重复, 则剪枝舍去
class Solution {
List<String> ans;
char[] ss;
public String[] permutation(String s) {
ss = s.toCharArray();
ans = new ArrayList<>();
dfs(0);
return ans.toArray(new String[0]);
}
public void dfs(int x) {
if (x == ss.length - 1) {
ans.add(String.valueOf(ss));
return;
}
Set<Character> set = new HashSet<>();
for (int i = x; i < ss.length ; i++) {
if (set.contains(ss[i])) {
continue;
}
set.add(ss[i]);
swap(x, i);
dfs(x + 1);
swap(i, x);
}
}
public void swap(int a, int b) {
char temp = ss[a];
ss[a] = ss[b];
ss[b] = temp;
}
}