Javascript 在所有可能的排列列表中查找给定字符串的秩

Javascript 在所有可能的排列列表中查找给定字符串的秩,javascript,performance,algorithm,ranking,Javascript,Performance,Algorithm,Ranking,我试图在可能的排列列表中找到给定字符串的排名。我试图想出一个解决方案,试图找到所有可能的排列,给它们分配一个等级,然后显示出来 但是,当字符串的长度不断增加时,这会大大降低性能。所以我想知道是否有人能想出一个有效的解决这个问题的办法 function permute(str) { // Sort the string var arr = []; for (var i = 0; i < str.length; i++) arr.push(str[i]); va

我试图在可能的排列列表中找到给定字符串的排名。我试图想出一个解决方案,试图找到所有可能的排列,给它们分配一个等级,然后显示出来

但是,当字符串的长度不断增加时,这会大大降低性能。所以我想知道是否有人能想出一个有效的解决这个问题的办法

function permute(str) {
    // Sort the string
    var arr = [];
    for (var i = 0; i < str.length; i++) arr.push(str[i]);
    var sortedString = arr.sort().join(''),
        // Length of the string
        length = str.length,
        used = [];
    // Create a boolean array for length of the string
    while (length--) used.push(false);
    // String buffer that holds the current string
    var out = '';
    // Call the function
    doPermute(sortedString, str, out, used, str.length, 0);
}
var count = 0;

function doPermute(inp, givenString, out, used, length, level) {
    // Only if length of the string equal to current level print it
    // That is permutation length is eqaul to string length
    if (level == length) {
        count++;
        //console.log('Perm :: ' + out + ' -- ' + count);
        if (out === givenString) {
            var pp = 'Rank of  :: ' + out + ' -- ' + count;
            $('div').append('<p>' + pp + '</p>');
        }
        return;
    }
    for (var i = 0; i < length; ++i) {
        // If variable used continue
        if (used[i]) continue;
        // Append the current char in loop
        out += inp[i];
        // set variable to true
        used[i] = true;
        // Call the function again
        doPermute(inp, givenString, out, used, length, level + 1);
        // Set it to false as the variable can be reused
        used[i] = false;
        // remove the last character of the buffer
        out = out.slice(0, out.length - 1)
    }
}

permute('dbcarf')
函数置换(str){
//对字符串排序
var-arr=[];
对于(var i=0;i');
}
返回;
}
对于(变量i=0;i

确定:如果输入字符串是
“cab”。
以c开头的字符串的最低秩是多少

c 注意它前面的字符串

abc
acb
bac
bca
因此,以c开头的字符串的最小秩为5。这只是输入字符串中按字典顺序排在c之前的字符数(顺序为a、b、c、d、e、f…),因此我们有2个。每个以字母开头的单词可以有2个单词。
下一个字母是“a”?
以“ca”开头的单词可以获得的最低等级是多少?
5
为什么?
“a”是用剩下的字母填充第二个位置的最佳方式。
第三个元素“b”也是如此。
所以“cab”的排名是5。

一般情况下。(假设没有重复项,但这并不难)

var-W//输入字符串
var C[26];
var秩=1;
对于(var i=0;i0)计数++;
}
C[W[i]-'a']=0;
秩+=计数*事实(W.长度-i-1);
}

中有一个解释,说明如何将n个对象上的排列转换为0..n范围内的数字-1并且它继续说,“将连续的自然数转换为阶乘数系统会产生字典顺序的序列(就像任何混合基数系统的情况一样),如果使用莱默码解释,将它们进一步转换为置换将保持字典顺序。”所以我会尝试做这个数字转换,看看它是否能根据你的定义产生与你需要的等级相关的东西。

@Aravind。。这真的很酷。。它几乎接近于使用不重复的字符。。但是,即使在找到字符串之后,秩也会增加该数量..检查这个:编辑:我有一个小错误,从int rank=1开始,然后更改此行。秩+=计数*事实(W.长度-i-1)@阿拉文。。太酷了。。似乎已经解决了这个问题。。要让它与复制品一起工作有多困难characters@Sushanth--:如果你熟悉排列n个事物的数学,其中a个事物与n个事物相似/A.然后,这只是一个简单的修改来处理重复字符。我尝试过这样做,但我的计算方式有问题。。所以它把它扔掉了。。让我把它传下去
var W; //input string
 var C[26];
 var rank = 1;
 for (var i = 0; i < W.length; i++) C[W[i] - 'a']++;
 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 < 26; j++) {
         if (j == (W[i] - 'a')) break;
         if (C[j] > 0) count++;
     }
     C[W[i] - 'a'] = 0;
     rank += count * fact(W.length - i - 1);
 }