package com.heu.wsq.leetcode.bingchaji;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class EquationsPossible {
public boolean equationsPossible(String[] equations) {
List<String> equalList = new ArrayList<>();
List<String> notequalList = new ArrayList<>();
for (String s: equations){
if (s.charAt(1) == '!'){
notequalList.add(s);
}else{
equalList.add(s);
}
}
UnionFind unionFind = new UnionFind(equalList.size() * 2);
Map<Character, Integer> map = new HashMap<>();
int id = 0;
for (String s: equalList){
char var1 = s.charAt(0);
char var2 = s.charAt(3);
if (!map.containsKey(var1)){
map.put(var1, id);
id++;
}
if (!map.containsKey(var2)){
map.put(var2, id);
id++;
}
unionFind.union(map.get(var1), map.get(var2));
}
for (String s: notequalList){
char var1 = s.charAt(0);
char var2 = s.charAt(3);
if (var1 == var2){
return false;
}
if (map.get(var1) == null || map.get(var2) == null){
continue;
}
boolean connected = unionFind.isConnected(map.get(var1), map.get(var2));
if (connected){
return false;
}
}
return true;
}
private class UnionFind{
private int[] parent;
public UnionFind(int n){
this.parent = new int[n];
for (int i = 0; i < n; i++){
this.parent[i] = i;
}
}
public void union(int x, int y){
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY){
return;
}
parent[rootX] = rootY;
}
private int find(int x){
int r = x;
while (r != parent[r]){
r = parent[r];
}
int k = x;
while (k != r){
int tmp = parent[k];
parent[k] = r;
k = tmp;
}
return r;
}
public boolean isConnected(int x, int y){
int rootX = find(x);
int rootY = find(y);
return rootX == rootY;
}
}
}