**解法1:思想:**不断地去字符串数组里面拿一个字符,从剩余的字符串选择一个拼接字符串,每拿一个减去一个;当字符串数组被拿空时,就把结果添加进结果数组里,然后回溯上一层,(通过往数组加回去字符以及拼接的字符串减少一个来回溯。)
算法步骤:
1.遍历字符串数组里面拿一个字符, 把该字符加入到result
arr定义为:ABCD:
取出A; rusult先把A放进去
2.原数组减去当前正在遍历的字符
arr变成了:BCD;
3.对于减去该字符的arr,递归perm方法;如此循环递归,跳出条件为:当index为length时,说明当A为第一个字母时字符串数组被拿空,结果添加进结果数组,遍历结束;
4.原数组加上当前正在遍历的字符
arr又变成了:ABCD;
5.for循环控制来到了遍历B元素:
rusult先把B放进去
后面同上递归
js核心实现代码:
for (let i = 0; i < arr.length; i++) {
if (!isRepeated.has(arr[i])) {
// 避免相同的字符交换
const char = arr.splice(i, 1)[0];
pStr += char;
permutate(arr, pStr, res);
arr.splice(i, 0, char); // 恢复字符串,回溯
pStr = pStr.slice(0, pStr.length - 1); // 回溯
isRepeated.add(char);
}
}```
解法2:递归思想
```cpp
function permutate2(arr, index, res) {
if (arr.length === index) {
return res.push(arr.join(''));
}
for (let i = index; i < arr.length; i++) {
[arr[index], arr[i]] = [arr[i], arr[index]]; // 交换
permutate2(arr, index + 1, res);
[arr[index], arr[i]] = [arr[i], arr[index]]; // 交换
}```