题目
给定一个字符串,获取该字符串所有的排列结果
- 假设给定的字符串为abcd
- 那么第一位的结果有四种a、b、c、d
- 第二位的结果有三种b、c、d
- 第三位的结果有两种c、d
- 最后一位的结果只有一种d
- 那么在进行遍历时,就需要将当前位置和它之后的所有字符做交换,同理当前位置后的字符也是
- 全排列就是交换,i 和 j 交换后,以当前为前缀,开启后面的递归,递归终止条件是到达数组长度后,然后回溯恢复交换前结果,继续递归
function sortAll(str) {
let strArr = str.split("");
let res = [];
function record(strArr, i) {
if (i === strArr.length) {
res.push(strArr.slice());
return;
}
// 全排列,交换当前位置字符和其之后的所有字符
for (let j = i; j < strArr.length; j++) {
[strArr[i], strArr[j]] = [strArr[j], strArr[i]];
record(strArr, i + 1);
// 每次交换结束后,按照递归路径进行还原,避免影响后续结果
[strArr[j], strArr[i]] = [strArr[i], strArr[j]];
}
}
record(strArr, 0);
console.log(res);
return res;
}
sortAll("abc");