Leetcode 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; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=