Encontrar el rango de la cadena dada en la lista de todas las posibles permutaciones con duplicados

Estaba intentando encontrar el rango de la cadena dada en la lista de permutaciones y esperaba que alguien pudiera encontrar el error.

function permute() { var W = $('input').val(), C = []; for (var i = 0; i < 26; i++) C[i] = 0; var rank = 1; for (var i = 0; i < W.length; i++) { C[W.charCodeAt(i) - 'a'.charCodeAt(0)]++; } var repeated= 1; for (var i = 0; i  0) { repeated *= fact(C[i]); } } if (W !== '') { for (var i = 0; i < W.length; i++) { //How many characters which are not used, that come before current character var count = 0; for (var j = 0; j  0) count++; } C[W.charCodeAt(i) - 'a'.charCodeAt(0)] = 0; rank += ( count * fact(W.length - i - 1) ); } rank = rank/ repeated; } var pp = 'Rank of :: ' + W + ' -- ' + rank; $('div').append('

' + pp + '

'); } function fact(n) { if (n == 0 || n == 1) return 1; else return fact(n - 1) * n; } $('button').click(permute);

Compruebe Fiddle

Un caso de uso para esto podría ser

bookkeeper se supone que debe dar un rango de 10743 .

Aquí está la demostración :

Para cada posición, compruebe cuántos caracteres quedan tienen duplicados, y use la lógica de que si necesita permutar n cosas y si ‘a’ las cosas son similares, ¡el número de permutaciones es n!/a!