Leetcode 990. 等式方程的可满足性(中等) 并查集

990. 等式方程的可满足性(中等)

题目:

给你一个数组 equations,装着若干字符串表示的算式。每个算式 equations[i] 长度都是 4,而且只有这两种情况:a==b 或者 a!=b,其中 a,b 可以是任意小写字母。你写一个算法,如果 equations 中所有算式都不会互相冲突,返回 true,否则返回 false。

比如说,输入 ["a==b","b!=c","c==a"],算法返回 false,因为这三个算式不可能同时正确。

再比如,输入 ["c==c","b==d","x!=z"],算法返回 true,因为这三个算式并不会造成逻辑冲突。

 

思路:

并查集

 

先使用a==b这些构建并查集,然后对不等式进行并查集查询。当结果不同时证明冲突

 

class UF {
public:
    UF(int n){
        count=n;
        for(int i=0;i<n;++i){
            parent.push_back(i);
            size.push_back(1);
        }
    }
    void Union(int p, int q){
        int rootp=find(p);
        int rootq=find(q);
        if(rootp==rootq){
            return;
        }
        if(size[rootp]>size[rootq]){
            size[rootq]+=size[rootp];
            parent[rootp]=rootq;
        }else{
            size[rootp]+=size[rootq];
            parent[rootq]=rootp;
        }
        count--;
    }
    int find(int x){
        while(x!=parent[x]){
            parent[x]=parent[parent[x]];
            x=parent[x];
        }
        return x;
    }
    bool connected(int p,int q){
        int rootp=find(p);
        int rootq=find(q);
        return rootp==rootq;
    }
    int count;
    vector<int> parent;
    vector<int> size;
};
class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        int n=equations.size();
        UF uf(26);
        bool ok=true;
        for(int i=0;i<n;++i){
            int p=equations[i][0]-'a';
            int q=equations[i][3]-'a';
            bool eq=equations[i][1]=='=';
            if(eq){
                uf.Union(p,q);
            }
        }
        for(int i=0;i<n;++i){
            int p=equations[i][0]-'a';
            int q=equations[i][3]-'a';
            bool eq=equations[i][1]=='=';
            if(!eq){
                if(uf.connected(p,q)){
                    ok=false;
                }
            }
        }
        return ok;
    }
};

 

posted @ 2022-02-22 19:43  鸭子船长  阅读(25)  评论(0编辑  收藏  举报