leetcode839相似字符串组

839.相似字符串组

每个字符串看作一个点,两个字符串之间是否相似看作边,则本题转化为图中有多少连通分量

//并查集模板
class UnionFind{
    vector<int>parent;
    vector<int>size;
    int n;
    int setCount;
public:
    UnionFind(int _n):n(_n),setCount(_n),parent(_n),size(_n,1){
        iota(parent.begin(),parent.end(),0);
    }

public:
    int findset(int x){
        return x==parent[x]?x:parent[x]=findset(parent[x]);
    }
    bool unite(int x,int y){
        x = findset(x);
        y = findset(y);
        if(x == y)return false;
        if(size[x]<size[y])swap(x,y);
        parent[y]=x;
        size[x]+=size[y];
        setCount--;
        return true;
    }
    bool connected(int x,int y){
        return x==y;
    }
    int get_setCount(){
        return setCount;
    }
    bool similar(string &a,string &b,int len){//比较两字符串不同的字符
        int cnt = 0;
        for(int i=0;i<len;i++){
            if(a[i]!=b[i]){
                cnt++;
                if(cnt>2)return false;
            }
        }
        return true;
    }
};
class Solution {
public:
    int numSimilarGroups(vector<string>& strs) {
        int n = strs.size();
        int m = strs[0].size();
        UnionFind uf(n);
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(uf.connected(i,j))continue;
                if(uf.similar(strs[i],strs[j],m))uf.unite(i,j);//如果两字符串相似,则连通
            }
        }
        return uf.get_setCount();

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值