其实思路的框架自己也想到了,但是没有想出如何处理并查集的代码实现。
并查集需要好好看看,需要注意的是这的之前的kruskal算法有关,需要仔细再复习复习。
思路
1.把等式全找出来,加入并查集。代码显示为union方法的调用。
2.把不等式全找出来,判断不等式在不在并查集里。
3.一旦有不等式在并查集里连通,说明条件有冲突,直接返回false;否则返回true
代码来源:
https://leetcode-cn.com/problems/satisfiability-of-equality-equations/solution/deng-shi-fang-cheng-de-ke-man-zu-xing-by-leetcode-/
class Solution {
public boolean equationsPossible(String[] equations) {
UnionFind unionFind = new UnionFind(26);
for (int i = 0; i < equations.length; i++) {
char[] arr = equations[i].toCharArray();
if (arr[1] == '='){
int x = arr[0] - 'a';
int y = arr[3] - 'a';
unionFind.union(x,y);
}
}
for (int i = 0; i < equations.length; i++) {
char[] arr = equations[i].toCharArray();
if (arr[1] == '!'){
int x = arr[0] - 'a';
int y = arr[3] - 'a';
if (unionFind.isConnected(x,y)){
return false;
}
}
}
return true;
}
}
class UnionFind {
private int[] parent;
public UnionFind(int n){
parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
public int find(int x){
while (x != parent[x]){
parent[x] = parent[parent[x]];
x = parent[x];
}
return x;
}
public void union(int x,int y){
int rootX = find(x);
int rootY = find(y);
parent[rootX] = rootY;
}
public boolean isConnected(int x,int y){
return find(x) == find(y);
}
}