LeetCode Solutions
990. Satisfiability of Equality Equations
Time: $O(n\log n)$ Space: $O(n)$
class UnionFind {
public:
UnionFind(int n) : id(n) {
iota(begin(id), end(id), 0);
}
void union_(int u, int v) {
id[find(u)] = find(v);
}
int find(int u) {
return id[u] == u ? u : id[u] = find(id[u]);
}
private:
vector<int> id;
};
class Solution {
public:
bool equationsPossible(vector<string>& equations) {
UnionFind uf(26);
for (const string& e : equations)
if (e[1] == '=') {
const int x = e[0] - 'a';
const int y = e[3] - 'a';
uf.union_(x, y);
}
for (const string& e : equations)
if (e[1] == '!') {
const int x = e[0] - 'a';
const int y = e[3] - 'a';
if (uf.find(x) == uf.find(y))
return false;
}
return true;
}
};
class UnionFind {
public int[] id;
public UnionFind(int n) {
id = new int[n];
for (int i = 0; i < n; ++i)
id[i] = i;
}
public void union(int u, int v) {
id[find(u)] = find(v);
}
public int find(int u) {
return id[u] == u ? u : (id[u] = find(id[u]));
}
}
class Solution {
public boolean equationsPossible(String[] equations) {
UnionFind uf = new UnionFind(26);
for (final String e : equations)
if (e.charAt(1) == '=') {
final int x = e.charAt(0) - 'a';
final int y = e.charAt(3) - 'a';
uf.union(x, y);
}
for (final String e : equations)
if (e.charAt(1) == '!') {
final int x = e.charAt(0) - 'a';
final int y = e.charAt(3) - 'a';
if (uf.find(x) == uf.find(y))
return false;
}
return true;
}
}
class UnionFind:
def __init__(self, n: int):
self.id = list(range(n))
def union(self, u: int, v: int) -> None:
self.id[self.find(u)] = self.find(v)
def find(self, u: int) -> int:
if self.id[u] != u:
self.id[u] = self.find(self.id[u])
return self.id[u]
class Solution:
def equationsPossible(self, equations: List[str]) -> bool:
uf = UnionFind(26)
for x, op, _, y in equations:
if op == '=':
uf.union(ord(x) - ord('a'), ord(y) - ord('a'))
return all(uf.find(ord(x) - ord('a')) != uf.find(ord(y) - ord('a'))
for x, op, _, y in equations
if op == '!')