方法一
const res = [], temp = []
const len = str.length
const arr = str.split('')
var help = function() {
if (temp.length === len) {
res.push(temp.join(''))
return
}
for (const s of arr) {
temp.push(arr.shift())
help()
arr.push(temp.pop())
}
}
help()
return [...(new Set(res))]
方法二
let set = new Set()
let addstr = (pre, str) => {
if(str.length == 0){
set.add(pre)
}
for(let i = 0; i < str.length; i++){
addstr(pre + str[i], str.slice(0, i).concat(str.slice(i+1)));
}
}
addstr("", str)
return Array.from(set)
方法三
let arr=str.split('')
let res=[]
function swap(p,q){
[arr[p],arr[q]]=[arr[q],arr[p]]
}
function dfs(p,q){
if(p===q){res.push(arr.join(''));return}
for(let i=p;i<=q;i++){
swap(p,i)
dfs(p+1,q)
swap(p,i)
}
}
dfs(0,arr.length-1)
res=Array.from(new Set(res))
return res
方法4
let len = str.length
let arr = str.split('')
let path = [], res = [], used = []
let death
const dfs = (path, used, arr, death, len) => {
if(death === len) {
res.push([...path].join(''))
return
}
for(let i = 0; i < len; i++) {
if(!used[i]) {
path.push(arr[i])
used[i] = true
dfs(path, used, arr, death + 1, len)
used[i] = false
path.pop()
}
}
}
dfs(path, used, arr, 0, len)
return [...(new Set(res))]