990. Satisfiability of Equality Equations
You are given an array of strings equations that represent relationships between variables where each string equations[i] is of length 4 and takes one of two different forms: "xi==yi" or "xi!=yi".Here, xi and yi are lowercase letters (not necessarily different) that represent one-letter variable names.
Return true if it is possible to assign integers to variable names so as to satisfy all the given equations, or false otherwise.
Example 1:
Input: equations = ["a==b","b!=a"]
Output: false
Explanation: If we assign say, a = 1 and b = 1, then the first equation is satisfied, but not the second.There is no way to assign the variables to satisfy both equations.
Example 2:
Input: equations = ["ba","ab"]
Output: true
Explanation: We could assign a = 1 and b = 1 to satisfy both equations.
Constraints:
- 1 <= equations.length <= 500
- equations[i].length == 4
- equations[i][0] is a lowercase letter.
- equations[i][1] is either '=' or '!'.
- equations[i][2] is '='.
- equations[i][3] is a lowercase letter.
From: LeetCode
Link: 990. Satisfiability of Equality Equations
Solution:
Ideas:
-
Build groups using all "x==y" first (Union-Find / DSU).
-
Then for each "x!=y", if x and y end up in the same group → contradiction → false.
-
Otherwise, it's satisfiable → true.
Code:
c
static int find(int parent[], int x) {
if (parent[x] != x) parent[x] = find(parent, parent[x]);
return parent[x];
}
static void unite(int parent[], int rank[], int a, int b) {
int ra = find(parent, a);
int rb = find(parent, b);
if (ra == rb) return;
if (rank[ra] < rank[rb]) {
parent[ra] = rb;
} else if (rank[ra] > rank[rb]) {
parent[rb] = ra;
} else {
parent[rb] = ra;
rank[ra]++;
}
}
bool equationsPossible(char** equations, int equationsSize) {
int parent[26], rank[26] = {0};
for (int i = 0; i < 26; i++) parent[i] = i;
// 1) Union all equalities.
for (int i = 0; i < equationsSize; i++) {
char *e = equations[i];
if (e[1] == '=' && e[2] == '=') {
int x = e[0] - 'a';
int y = e[3] - 'a';
unite(parent, rank, x, y);
}
}
// 2) Check all inequalities against the union-find sets.
for (int i = 0; i < equationsSize; i++) {
char *e = equations[i];
if (e[1] == '!' && e[2] == '=') {
int x = e[0] - 'a';
int y = e[3] - 'a';
if (find(parent, x) == find(parent, y)) return false;
}
}
return true;
}