Two-pass union-find over 26 letters
Time O(n α(26)) Space O(26)Union both sides of every ==. Then for every !=, if both sides share a root, return false.
class Solution {
private final int[] parent = new int[26];
public boolean equationsPossible(String[] equations) {
for (int i = 0; i < 26; i++) parent[i] = i;
for (String e : equations)
if (e.charAt(1) == '=') parent[find(e.charAt(0) - 'a')] = find(e.charAt(3) - 'a');
for (String e : equations)
if (e.charAt(1) == '!' && find(e.charAt(0) - 'a') == find(e.charAt(3) - 'a')) return false;
return true;
}
private int find(int x) {
while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }
return x;
}
}Verdict: Order of passes matters; equalities must be complete first.