問題描述:
給定一個由表示變量之間關係的字符串方程組成的數組,每個字符串方程 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;
}
};