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);
}