function permAlone(str) {
var arr = [];
for(var index in str) {
arr.push(str[index]);
}
//console.log(arr);
var permutations = getPermutation(arr);
for(var index in permutations) {
var tamp = permutations[index].join("");
permutations[index] = tamp;
}
permutations = getDifference(permutations);
console.log(permutations);
return permutations;
}
permAlone("aba");
function getDifference(arr) {
//去掉有连续两个项的
//console.log(/(.)\1/g.test("baa")); // false
var result = [];
for(var i = 0; i < arr.length; i++) {
if(!/(.)\1/g.test(arr[i])) {
result.push(arr[i]);
}
}
return result;
}
function getPermutation(arr) {
if(arr.length == 1) {
return [arr];
}
var permutation = [];
for(var i = 0; i < arr.length; i++) {
var firstEle = arr[i];
var arrClone = arr.slice(0);
arrClone.splice(i, 1);
var childPermutation = getPermutation(arrClone);//递归 获得全排列
for(var j = 0; j < childPermutation.length; j++) {
childPermutation[j].unshift(firstEle);
}
permutation = permutation.concat(childPermutation);
}
return permutation;
}
递归的原理是:比如 “123”的全排列,可以看作 1+[23,32];2+[13,31];3+[12,21]; 而“23”又可以看作 2+[3] ;3+[2];
所以递归的方式就是不断查找n-1 项的排列, 直到为1 ,返回其本身;