题目描述
https://leetcode-cn.com/problems/satisfiability-of-equality-equations/
思路
先写一个并查集的类,类中所实现的功能就是
构造函数
,初始化所有出现的字母,让他们的父亲节点指向自己查找父亲节点的函数
,只有父亲节点才会满足 当前位置 p == arr[p],并且进行路径压缩优化一下并查集的合并函数
,将需要合并的集合进行合并,先找到各自的父亲节点,
如果父亲节点不相同,就合并;
相同则说明在一个集合里,就不需要合并
接下来,在操作的过程中
- 把
==
的方程式的两个字符进行合并 - 再判断
!=
的方程是否合理,判断的方法就是找他们各自的父亲节点
如果相同
,就说明在同一个集合中,就返回 false
如果不同
,就说明不在同一个集合,继续判断下一组 !=
代码实现
class Union
{
public:
Union(vector<string>& equ)
{
arr = vector<int> (50,0);
for(auto& eoch : equ)
{
arr[eoch[0] - 'a'] = eoch[0] - 'a';
arr[eoch[3] - 'a'] = eoch[3] - 'a';
}
}
//寻找父亲节点,父亲节点才是 p == arr[p]
int FindFather(int p)
{
if(p != arr[p]) arr[p] = FindFather(arr[p]);
return arr[p];
}
//合并
void Merge(int u,int v)
{
int Fu = FindFather(u);
int Fv = FindFather(v);
if(Fu != Fv) arr[Fu] = Fv;
}
private:
vector<int> arr;
};
class Solution {
public:
bool equationsPossible(vector<string>& equations) {
Union un(equations);//初始化
//先合并 == 的集合
for(auto& eoch : equations)
if(eoch[1] == '=') un.Merge(eoch[0] - 'a',eoch[3] - 'a');
//在判断 != 的等式中,他们各自的父亲节点是否相同
//相同 --》 不符合
//不同 --》 继续判断下一个
for(auto& eoch : equations)
if(eoch[1] == '!')
{
int Fu = un.FindFather(eoch[0] - 'a');
int Fv = un.FindFather(eoch[3] - 'a');
if(Fu == Fv) return false;
}
return true;
}
};