给定一个字符串或者数组,输出所有排列的可能。如输入“abc或者['a','b','c']”,输出['abc','acb','bca','bac','cab','cba']。
// 全排列
function fullpermutate(str) {
// 验证参数只能是数组或者字符串
var typeValue = Object.prototype.toString.call(str).slice(8,-1).toLowerCase();
if(!['string','array'].includes(typeValue)) throw Error("参数必须为数组或者字符串")
str = typeValue === 'array' ? str.join('') : str
var result = [];
var len = str.length;
if (str.length <= 1) return [str]; //如果长度小等于1,则返回本身
for (var m = 0; m < len; m++) {
var left = str[m];
// 没过滤有空格的情况,把每个空格也当做字符来计算
if (left === str[m + 1]) continue; //如重复则跳过,如输入11 则直接返回[11]即可,不需要返回 [11,11],看你需求
// 除当前的元素和其他元素组合
var rest = str.slice(0, m) + str.slice(m + 1, len);
// 递归上一次返回的全排列
var preResult = fullpermutate(rest);
// 组合在一起
for (var i = 0; i < preResult.length; i++) {
var tmp = left + preResult[i];
result.push(tmp);
}
}
return result;
}
console.log(fullpermutate('abc')); //['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
console.log(fullpermutate(['a','a','b'])) //['aab', 'aba', 'baa']