|
function permAlone(str) { |
|
function factorial(n){ |
|
var f = n; |
|
for (var i=n-1;i>0;i--){f *= i;} |
|
return f; |
|
} |
|
var fact = factorial(str.length); |
|
var permuts = []; |
|
var tmpArr = []; |
|
var counter = 0; |
|
var strArr = str.split(""); |
|
(function fillPermutsArr(){ |
|
//console.log("> function"); |
|
for (var p=0;p<strArr.length;p++){ |
|
//console.log("\tstrArr: "+strArr+" | iteration: "+p); |
|
var zeroIndexChar = strArr.splice(p,1)[0]; |
|
//console.log("\tchar: "+zeroIndexChar+" | strArr, spliced: "+strArr+" | iteration: "+p); |
|
tmpArr.push(zeroIndexChar); |
|
//console.log("\ttmpArr, pushed: "+tmpArr+" | iteration: "+p); |
|
if (strArr.length === 0){ |
|
permuts.push(tmpArr.join().split(",")); |
|
//console.log("=> push permut, permuts: "+JSON.stringify(permuts)+" | iteration: "+p); |
|
}else{ |
|
//console.log("~ recursion"); |
|
fillPermutsArr(); |
|
} |
|
//console.log("\tstrArr: "+strArr+" | iteration: "+p); |
|
strArr.splice(p,0,zeroIndexChar); |
|
//console.log("\tstrArr, spliced: "+strArr+"| iteration: "+p); |
|
//console.log("\ttmpArr: "+tmpArr+" | iteration: "+p); |
|
tmpArr.pop(); |
|
//console.log("\ttmpArr, popped: "+tmpArr+" | iteration: "+p); |
|
//console.log("~ loop body bottom reached | strArr: "+strArr+" | iteration: "+p); |
|
if (p == 2){ |
|
//console.log("=> done, permuts: "+JSON.stringify(permuts)+" | iteration: "+p); |
|
} |
|
} |
|
})(); |
|
if (fact == permuts.length){ |
|
for (var q=0;q<permuts.length;q++){ |
|
var letterOccurrenceCounter = 0; |
|
for (var u=1;u<permuts[q].length;u++){ |
|
if (permuts[q][u-1] == permuts[q][u]){letterOccurrenceCounter++;} |
|
} |
|
if (letterOccurrenceCounter === 0){counter++;} |
|
} |
|
return counter; |
|
//return "factorial: "+fact+" | "+"counter: "+counter+" | "+JSON.stringify(permuts); |
|
}else{ |
|
return "ERROR: factorial and formed permutations array lengths are not equal"; |
|
} |
|
} |
|
permAlone('abc'); |
|
//permAlone('aab'); |
|
//permAlone("aabb"); |
|
//permAlone("abcdefa"); |
|
//permAlone("abfdefa"); |
|
//permAlone("zzzzzzzz"); |