/**
* @param {string} S
* @return {string[]}
*/
var permutation = function(S) {
// 存储结果的数组
let ans = []
// 存储当前排列的数组
let path = []
// 将字符串 S 转换为数组后进行排序得到的数组
let choice = S.split('').sort()
// 定义回溯函数
function trace(){
// 如果找到了一个完整的排列,将其转换为字符串并放入结果数组中
if (path.length === S.length) ans.push(path.join(''))
// 遍历选择数组
for (let i = 0; i < choice.length; i++){
// 进行一些剪枝操作,排除已经被选择过的元素以及连续重复的元素
if (choice[i] == null || i > 0 && choice[i] == choice[i-1]) continue
// 选择当前元素,并将其从选择数组中移除
let tmp = choice[i]
choice[i] = null
// 将选择的元素添加到当前排列数组中
path.push(tmp)
// 递归调用,继续向下搜索
trace()
// 恢复之前的状态,即从当前排列数组中移除选择的元素,并将其放回选择数组的相应位置
path.pop()
choice[i] = tmp
}
}
// 调用回溯函数
trace()
// 返回结果数组
return ans
};