2013-07-12 31 views
1

我試圖在排列列表中找到給定字符串的排名,並希望有人能找到該錯誤。查找給定字符串在所有可能的排列列表中的排名重複

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 < C.length; i++) { 
     if(C[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 < 26; j++) { 
       if (j == (W.charCodeAt(i) - 'a'.charCodeAt(0))) break; 
       if (C[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('<p>' + pp + '</p>'); 
} 

function fact(n) { 
    if (n == 0 || n == 1) return 1; 
    else return fact(n - 1) * n; 
} 

$('button').click(permute); 

Check Fiddle

一個用例,這可能是

bookkeeper應該得到一個等級。

+0

問題是什麼?你有測試用例來顯示錯誤嗎? –

+0

'簿記員'應該給予10743的排名..但我認爲我已經搞砸了 –

+0

當你給它「簿記員」時,這是一個相當明顯的錯誤...你應該編輯它,以便其他人可能會注意到它。 –

回答

2

這裏的demo

對於每個位置檢查剩餘的字符有重複,並使用邏輯,如果你需要置換n Things的,如果「一」的東西是相似的排列數爲n!/a!

+0

我認爲它仍然給出了錯誤的排名..用例可能是'簿記員應該給予10743的排名。' –

+0

酷!我在簡單的案例中對它進行了測試,結果很順利,讓我看看。 – Aravind

+1

abab 4爲什麼? 1是aabb,那麼2是什麼? –

相關問題