题目链接:字符串的排列
题目描述:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
题目分析:此题目为字符串的全排列,
1)使用回溯的方式,在回溯中对字符串进行遍历,同时标记某一个字符是否在当前排列中出现过,若出现过则跳过,没有出现过则加入排列。然后从下一个字符处开始进行回溯。
因为字符串数组不能重复,所以使用哈希表set来进行去重。
var permutation = function (s) {
const length = s.length;
if (length == 1)
return [s];
let flag = new Array(length).fill(false);
let set = new Set();
backtrack(0, []);
return Array.from(set);
function backtrack(index, temp) {
if (index == length) {
if (!set.has(temp.join('')))
set.add(temp.join(''))
return;
}
for (let i = 0; i < length; i++) {
if (flag[i])
continue;
flag[i] = true;
temp.push(s[i]);
backtrack(index + 1, temp);
flag[i] = false;
temp.pop();
}
}
}
这样得到的字符串数组是无序的。
2)同样使用回溯的方式,只是去重的方法不同,不用哈希表。
将字符串转换成数组进行排序。那么相同的字符肯定是相邻的,所以当某字符不在排列中时,需要判断和前一个字符是否相等,若和前一个字符相等,那么当前一个字符在排列中的时候,该字符才能加入排列;否则若前一个字符不在排列中,该字符也不能加入排列。
js代码如下:
const length = s.length;
if (length == 1)
return [s];
let arr = Array.from(s).sort();
let res = [];
let flag = new Array(length).fill(false);
backtrack(0, []);
return res;
function backtrack(index, temp) {
if (index == length) {
res.push(temp.join(''));
return;
}
for (let i = 0; i < length; i++) {
if (flag[i] || (!flag[i] && arr[i] == arr[i - 1] && !flag[i - 1]))
continue;
flag[i] = true;
temp.push(arr[i]);
backtrack(index + 1, temp);
flag[i] = false;
temp.pop();
}
}
这样最终得到的字符串数组是有序的。