Finding the ranking of a word (permutations) with duplicate letters

前端 未结 6 637
有刺的猬
有刺的猬 2020-11-27 07:09

I\'m posting this although much has already been posted about this question. I didn\'t want to post as an answer since it\'s not working. The answer to this post (Finding th

6条回答
  •  星月不相逢
    2020-11-27 07:43

    I would say David post (the accepted answer) is super cool. However, I would like to improve it further for speed. The inner loop is trying to find inverse order pairs, and for each such inverse order, it tries to contribute to the increment of rank. If we use an ordered map structure (binary search tree or BST) in that place, we can simply do an inorder traversal from the first node (left-bottom) until it reaches the current character in the BST, rather than traversal for the whole map(BST). In C++, std::map is a perfect one for BST implementation. The following code reduces the necessary iterations in loop and removes the if check.

    long long rankofword(string s)
    {
        long long rank = 1;
        long long suffixPermCount = 1;
        map m;
        int size = s.size();
        for (int i = size - 1; i > -1; i--)
        {
            char x = s[i];
            m[x]++;
            for (auto it = m.begin(); it != m.find(x); it++)
                    rank += suffixPermCount * it->second / m[x];
    
            suffixPermCount *= (size - i);
            suffixPermCount /= m[x];
        }
        return rank;
    }
    

提交回复
热议问题