题目
原题链接
等式方程的可满足性
思路
- 定义一个长度为26(变量为小写字母)的数组充当并查集,并将数组中的元素初始化为 -1
- 判断“==”并合并元素,将相等的放在一个集合中
- 判断“!=”;不等的如果在一个集合中,则矛盾返回false;否则,返回true
C++代码
class Solution
{
public:
bool equationsPossible(vector<string>& equations)
{
// 初始化并查集
vector<int> ufs(26, -1);
auto findRoot = [&ufs](int x)
{
int parent = x;
while (ufs[parent] >= 0)
{
parent = ufs[parent];
}
return parent;
};
// 判断“==”并合并元素,将相等的放在一个集合中
for(auto e : equations)
{
if(e[1] == '=')
{
int parent1 = findRoot(e[0] - 'a');
int parent2 = findRoot(e[3] - 'a');
if(parent1 != parent2)
{
ufs[parent1] += ufs[parent2];
ufs[parent2] = parent1;
}
}
}
// 判断“!=”;不等的如果在一个集合中,则矛盾返回false;否则,返回true
for(auto e : equations)
{
if(e[1] == '!')
{
int parent1 = findRoot(e[0] - 'a');
int parent2 = findRoot(e[3] - 'a');
if(parent1 == parent2)
{
return false;
}
}
}
return true;
}
};