• 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;
        }
    };
  • 相关阅读:
    iscroll.js & flipsnap.js
    IE8’s Substr() Bug
    chrome扩展,如何阻止浏览自动关闭桌面通知.
    临时邮箱
    多个显示器, window.open的定位
    页面刷新
    PipelineDB Install and Test
    CitusDB UPSERT
    Kafka部署
    ambari-cassandra-service
  • 原文地址:https://www.cnblogs.com/zl1991/p/15924651.html
Copyright © 2020-2023  润新知