使用递归调用的方式实现字符串的全排列,并将结果去重
// 循环遍历字符串,将所有的字符放在第一位,再递归遍历剩余的字符,依次将所有的字符放在剩下字符的第一位
// 当字符长度为一时,返回,然后将递归结果依次拼接 即可得到全排列 字符串
function permutation (per) {
if (per.length === 1) { return [per] }
let res = []; // 分号是必须的
// 这里使用... 扩展运算符,简单的将字符串转为数组
[...per].forEach((v, i, str) => {
const temp = [...str] // 为了不影响原数组,这里将数组浅拷贝了一下
const header = temp.splice(i, 1)
permutation(temp).forEach(value => res.push([header, ...value].join('')))
})
return [...new Set(res)]
}
permutation('abca') // ["abca", "abac", "acba", "acab", "aabc", "aacb", "baca", "baac", "bcaa", "caba", "caab", "cbaa"]