LeetCode990.等式方程的可滿足性 每日一題6月8日

問題描述:

給定一個由表示變量之間關係的字符串方程組成的數組,每個字符串方程 equations[i] 的長度爲 4,並採用兩種不同的形式之一:"a==b" 或 "a!=b"。在這裏,a 和 b 是小寫字母(不一定不同),表示單字母變量名。

只有當可以將整數分配給變量名,以便滿足所有給定的方程時才返回 true,否則返回 false。 

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/satisfiability-of-equality-equations

示例 1:

輸入:["a==b","b!=a"]
輸出:false
解釋:如果我們指定,a = 1 且 b = 1,那麼可以滿足第一個方程,但無法滿足第二個方程。沒有辦法分配變量同時滿足這兩個方程。


示例 2:

輸入:["b==a","a==b"]
輸出:true
解釋:我們可以指定 a = 1 且 b = 1 以滿足滿足這兩個方程。


示例 3:

輸入:["a==b","b==c","a==c"]
輸出:true


示例 4:

輸入:["a==b","b!=c","c==a"]
輸出:false


示例 5:

輸入:["c==c","b==d","x!=z"]
輸出:true

解題思路:

採用並查集,遍歷。

先將等於號的左右的併入一個集合,都有相同的父節點,

然後將不等於的,比較各種的父節點

class Solution {
public:
    vector<int> fa;
    bool equationsPossible(vector<string>& equations) {
        fa.resize(26);
         for(int i=0;i<26;i++) fa[i]=i;
         for(auto x:equations){
            //將等於的併入一個集合
             if(x[1]=='!') continue;
             int a=x[0]-'a';
             int b=x[3]-'a';
             Union(a,b);
         }
         for(auto x:equations){
            //比較不等的
             if(x[1]=='=') continue;
             int a=x[0]-'a';
             int b=x[3]-'a';
             int fa=findFather(a);
             int fb=findFather(b);
             if(fa==fb) return 0;
         }
         return 1;
    }
    int findFather(int x){
        int a = x;
        while(x != fa[x]){
            x = fa[x];
        }
        while(a != fa[a]){
            int z = a;
            a = fa[a];
            fa[z] = x;
        }
	    return x;
    }
    void Union(int a,int b){
        int faA = findFather(a);
        int faB = findFather(b);
        if(faA != faB) fa[faA] = faB;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章