Я пытаюсь найти ранг данной строки в списке возможных перестановок. Я попытался найти решение, которое пытается найти все возможные перестановки, присвоить им ранг и затем отобразить его.Поиск ранга данной строки в списке всех возможных перестановок
Но это значительно снижает производительность, когда длина строки продолжает увеличиваться. Так было интересно, если кто-то может придумать эффективное решение для этой проблемы ..
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')
@ Aravind .. Это действительно круто .. Это почти близко к работе с повторяющимися символами. Http://jsfiddle.net/QV5LF/3/ .. За исключением того, что ранг увеличивается на эту сумму даже после того, как строка найдена. –
Проверьте это: http://jsfiddle.net/QV5LF/7/ Редактировать: У меня была небольшая ошибка, начиная с int rank = 1, а затем измените эту строку. rank + = count * fact (W.length - i - 1); – Aravind
@ Aravind .. это круто .. Кажется, решила проблему .. Как трудно было бы заставить ее работать с дублирующимися символами –