[并查集] leetcode 839 Simlilar String Groups

problem:https://leetcode.com/problems/similar-string-groups/

 

     此题是最普通的并查集,没有什么变化,但有卡数据点的地方,所以需要使用优化过的并查集,此处使用的方法是把元素个数较少的集合作为子节点合并到较大的集合上,避免出现较长的分支。

class DisjoinSet
{
    vector<int> nums;
    vector<int> parent;
    int size;
    DisjoinSet(int N)
    {
        size = N;
        parent.resize(N);
        nums.resize(N);
        for (int i = 0; i < N; i++)
        {
            parent[i] = i;
            nums[i] = 1;
        }
    }
    int Find(int x)
    {
        while (x != parent[x])
        {
            x = parent[x];
        }
        return x;
    }
    void Union(int x, int y)
    {
        int px = Find(x);
        int py = Find(y);
        if (px != py)
        {
            if(nums[px] > nums[py])
            {
                nums[px] += nums[py];
                nums[py] = nums[px];
                parent[py] = px;
            }
            else
            {
                nums[py] += nums[px];
                nums[px] = nums[py];
                parent[px] = py;
            }    
            size--;
        }
    }
    int GetNumber()
    {
        return size;
    }
};

class Solution {
public:
    bool IsSimilar(const string& s1, const string& s2)
    {
        int count = 0;
        for(int i = 0;i < s1.size();i++)
        {
            if(s1[i] != s2[i]) 
            {
                count++;
            }
            if(count > 2) return false;
        }        
        return true;
    }
    int numSimilarGroups(vector<string>& A) {
        DisjoinSet set(A.size());
        for(int i = 0;i < A.size();i++)
        {
            for(int j = i + 1; j < A.size();j++)
            {
                if(IsSimilar(A[i], A[j]))
                {
                    set.Union(i, j);
                }
            }
        }
        return set.GetNumber();
    }
};

 

posted @ 2019-07-28 17:06  fish1996  阅读(224)  评论(0)    收藏  举报