题目描述
输入一个字符串,打印出该字符串中字符的所有排列。可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
题目解答
该题目的特殊要求是字符排列中不能有重复元素,所以不能使用第17题(打印从1到最大的n位数)的全排列解答。
无上述要求的解法:(元素可重复)
输入:"ab"
输出:["aa","ab","ba","bb"]
var permutation = function(s) {
var result = [];
var str = [];
if(s.length<=0){
return result;
}
if(s.length==1){
result.push(s);
return result;
}
var length = s.length;
for(var i=0;i<length;i++)
{
// 第一位的可能情况
str[0] = s[i];
// 其他位的情况
printOtherChar(s,0);
}
function printOtherChar(s,index){
// 一种排列完成的结束标识
if(index == length-1){
// 将字符数组转换成字符串存入result数组
result.push(str.join('').toString());
return ;
}
// 递归完成所有位数的字符排列
for(var j=0;j<length;j++)
{
str[index+1] = s[j];
printOtherChar(s,index+1);
}
}
return result;
};
元素不可重复:
set方法去重+回溯:
创建一个visit数组,对应着所给字符串的每个字符是否已经访问。以此防止字符的重复。
var permutation = function(s) {
const set = new Set();
const visited = {};
function dfs(path){
for(let i=0;i<s.length;i++){
if(path.length === s.length) return set.add(path);
if(visited[i]) continue;
visited[i] = true;
dfs(path+s[i]);
visited[i] = false;
}
}
dfs('');
return [...set];
};
es6中新增的Map和Set数据结构
-
Map
是类似Object的一种键值对集合,区别在于Map的键可以是各种类型的值。
const a = new Map(); a.set(0,'askdha'); // 在Map里添加键、值 a.get(0); //根据键获取对应值
-
Set
是类似数组的一种数据结构,不同点在于Set中没有重复的值
const set = new Set([1,1,2,3,4,2]); //set{1,2,3,4} set.add(66); // [1,2,3,4,66] set.delete(1); // 删除 set.size; //长度 4