LeetCode 839. 相似字符串组

困难题,没有想到并查集的思想,并且很久不做有点生疏;

 

以前并查集都是针对于单个目标的次序排列问题,头一次遇到这种归类问题;

 

基础思想是判断两个字符串是否属于一类,但是这一个问题也蕴含了次序的问题;

例如,a,b,c;

有可能a,b相似,b,c相似,而a,c不相似;

也有可能a,c相似,b,c相似,a,b不相似;

所以就可以采用并查集的思想,直接把这种次序转化为根节点是否是同类,来进行合并,最后数数有几个并查集即可;

 

遇到问题点:

合并的时候是根节点合并,自己蠢得一笔各种叶节点合并到根节点,导致最后并查集合并错误;

 

class Solution {
public:
    vector<int>father;

    void init() {
        for (int i = 0; i < father.size(); i++)
            father[i] = i;
    }

    bool isSimilar(const string& a, const string& b) {
        int count = 0;
        for (int i = 0; i < a.size(); i++) {
            if (a[i] != b[i])
                count++;
        }
        if (count > 2)
            return false;
        else
            return true;
    }

    int findfather(int x) {
        if (x == father[x])
            return x;
        int fa=findfather(father[x]);
        father[x] = fa;
        return fa;
    }

    int numSimilarGroups(vector<string>& strs) {
        int strs_len = strs.size();
        int str_len = strs[0].size();
        father.resize(strs_len);
        init();
        for (int i = 0; i < strs_len; i++) {
            for (int j = i + 1; j < strs_len; j++) {
                int fa = findfather(i);
                int fb = findfather(j);
                if (isSimilar(strs[i], strs[j])) {
                    father[fa]=fb;
                }
            }
        }
        int count = 0;
        for (int i = 0; i < father.size(); i++) {
            if (father[i] == i)
                count++;
        }
        return count;
    }
};

  

 

posted @ 2021-01-31 16:21  暮云林凌  阅读(43)  评论(0编辑  收藏  举报