解题思路
dfs回溯。对于字符串的每个位置进行安排,用Set判断是否已经安排过“待排雷字符集”中的重复字符。 固定x位置字符的方式是通过交换,这样对于某层dfs来说,前面的字符都已经固定,而从x到len-1位置的就是“待排列字符集”。
代码
var permutation = function (s) {
function swap(i, j, a) { let t = a[i]; a[i] = a[j]; a[j] = t; }
let res = []; let len = s.length;
let c = s.split('');
function dfs(x) {
if (x == len - 1) {
res.push(c.join('')); return;
}
let set = new Set();
for (let i = x; i < len; i++) {
//对于每种排列的位置x来说,i要从当前尚未安排字符的位置x到最后
//每次迭代对于c[i]来说,只要它没在当前位置排过,就将其与c[x]交换位置
//然后进入下一个位置层的递归
if (set.has(c[i])) continue; //当前位置x层已经安排过c[i],剪枝
set.add(c[i]); //否则加入当前位置x层的set中以便后续判断
swap(i, x, c); //安排c[i]到位置x
dfs(x + 1); //进入下一层(x+1层)递归
swap(x, i, c); //回到当前位置x层,恢复原位
}
}
dfs(0);
return res;
};