剑指 Offer 38. 字符串的排列
mengjian-github opened this issue · comments
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zi-fu-chuan-de-pai-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
典型的回溯算法,但要注意的是字符串中可能有重复字母,这需要用下标来标记,并且结果要去重:
/**
* @param {string} s
* @return {string[]}
*/
var permutation = function(s) {
const result = [];
let visited = [];
function backtrack(trace = '') {
if (trace.length >= s.length) {
if (!result.includes(trace)) {
result.push(trace);
}
return;
}
for (let i = 0; i < s.length; i++) {
if (!visited[i]) {
trace += s[i];
visited[i] = s[i];
backtrack(trace);
trace = trace.slice(0, -1); // 回溯
visited[i] = false;;
}
}
}
backtrack();
return result;
};