一、题目
输入一个字符串,打印出该字符串中,所有字符的排列组合。
输入:'abc'
输出:['abc', 'acb', 'bca', 'bac', 'cab', 'cba']
二、思路
回溯算法。其核心思想是通过递归的方式进行深度优先搜索,当发现当前的选择不符合要求时,进行回退(即回溯)到上一个状态,并继续尝试其他的选择。通常适用于组合问题、排列问题、选择问题等需要搜索所有可能解的情况。
1. 创建一个空数组 result
用于存储生成的排列组合。
2. 定义一个辅助函数 permute
,它接收两个参数:当前已形成的排列组合 current
和剩余的字符数组 remaining
。
3. 如果 remaining
数组为空,表示已经处理完所有字符,将 current
加入到 result
数组中。否则,遍历 remaining
数组,每次取出一个字符,将其追加到 current
中,并从 remaining
数组中移除该字符。然后,递归调用 permute
函数,传入更新后的 current
和 remaining
数组。
4. 在每一轮迭代中,需要进行回溯操作,即将已处理的字符重新加入到 remaining
数组,并将其从 current
中移除,以便尝试其他可能的组合。
5. result
数组去重
三、代码
const str = 'abc'
function getPermutations(str) {
const result = [];
function permute(current, remaining) {
if (remaining.length === 0) {
result.push(current);
} else {
for (let i = 0; i < remaining.length; i++) {
// 每次都拿出来一个放在最前面
const next = current + remaining[i];
// 删除被拿出来的那个,得到新字符串
const remainingChars = remaining.slice(0, i) + remaining.slice(i + 1);
// 新字符串递归
permute(next, remainingChars);
}
}
}
permute('', str);
// 去重
return [...new Set(result)]
}
// 示例用法
const input1 = 'abb';
const input2 = 'abc';
console.log(getPermutations(input1));
console.log(getPermutations(input2));
输出: