题意
题解
方程只有 x = = y x==y x==y 与 x ! = y x!=y x!=y 两种形式。对于等式关系,可以用并查集维护;而不等式的关系则难以用并查集维护。那么可以先用并查集维护等式;再根据不等式两端变量是否在一个集合中判断不等式的可满足性。
class Solution
{
#define maxn 26
public:
int par[maxn];
int rank[maxn];
void union_find_init(int n)
{
for (int i = 0; i < n; i++)
{
par[i] = i;
rank[i] = 0;
}
}
int find(int x)
{
if (par[x] == x)
return x;
return par[x] = find(par[x]);
}
bool same(int x, int y)
{
return find(x) == find(y);
}
void unite(int x, int y)
{
x = find(x), y = find(y);
if (x == y)
return;
if (rank[x] > rank[y])
par[y] = x;
else
{
if (rank[x] == rank[y])
++rank[y];
par[x] = y;
}
}
bool equationsPossible(vector<string> &equations)
{
union_find_init(maxn);
for (auto s : equations)
{
if (s[1] == '=')
{
unite(s[0] - 'a', s[3] - 'a');
}
}
for (auto s : equations)
{
if (s[1] == '!')
{
if (same(s[0] - 'a', s[3] - 'a'))
return false;
}
}
return true;
}
};