Skip to content

Instantly share code, notes, and snippets.

@rfprod
Last active April 22, 2017 15:51
Show Gist options
  • Save rfprod/c110a38aeb1e881ec50c to your computer and use it in GitHub Desktop.
Save rfprod/c110a38aeb1e881ec50c to your computer and use it in GitHub Desktop.
String Permutations With No Character Repeats
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");

String Permutations With No Character Repeats

Returns the number of total permutations of the provided string that don't have repeated consecutive letters. In this particular case number of permutations for, for example, 3-character string equals !3 = 3 * 2 * 1 = 6. For example, 'aab' should return 2 because it has 6 total permutations, but only 2 of them don't have the same letter (in this case 'a') repeating.

A script by V.

License.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment