此字谜子字符串搜索算法中的数学



在下面的代码中:

function sherlockAndAnagrams(s) {
var pairs = 0;
var subStrings = {};
//find all substrings of our string, count them in a hash
for(var i = 0; i < s.length; i++){
    for(var j = i; j < s.length; j++){
        let tempSubString = s.substring(i, j+1).split("").sort().join("");
        if(subStrings[tempSubString]){
            subStrings[tempSubString] +=1;
        }else{
            subStrings[tempSubString] = 1;
        }
    }
}
//****ATTENTION******
for(var keys in subStrings){
    if(subStrings[keys] > 1){
    let temp = (subStrings[keys])*(subStrings[keys]-1)/2;
       pairs += temp;
   }
}
return pairs;
}

我不确定这个公式背后的数学是如何工作的:

子字符串[键])

*(子字符串[键]-1)/2

假设 s = "kkkk",则有 6 个 "k" 的字谜

有人可以解释一下吗?

此外,这告诉我,我可能在某些类型的数学上有点欠缺。如果你能给我一个很好的学习材料来弄清楚这样的数学,我将不胜感激!

逻辑如下:你有n个单词,它们是彼此的字谜。您可以从中选择多少对字谜?这是一个简单的组合问题,有一个已知的答案:双名义(n,2)系数为n*(n-1)/2

逻辑是,如果你计算所有的字谜,第一个字谜你可以用n方式选择,第二个n-1方式选择,但每个字谜将被视为两次:一次是ab=ba,另一次是ba=ab

最新更新