题目链接:LeetCode 990
题目思路:并查集,第一次遍历构建并查集的集合关系,第二次检查违反并查集集合关系的情况,如果有就返回false,如果没有的话返回true即可。
class Solution {
public boolean equationsPossible(String[] equations) {
// 初始化字母序列的并查集
int[] father = new int[26];
for(int i = 0; i < 26; i++)
{
father[i] = i;
}
// 构建并查集的关系
for(String str: equations)
{
if(str.charAt(1) == '=')
{
int index1 = str.charAt(0) - 'a';
int index2 = str.charAt(3) - 'a';
union(father, index1, index2);
}
}
// 检查违反并查集的关系
for(String str: equations)
{
if(str.charAt(1) == '!')
{
int index1 = str.charAt(0) - 'a';
int index2 = str.charAt(3) - 'a';
if(find(father, index1) == find(father, index2))
return false;
}
}
return true;
}
public void union(int[] father, int i, int j)
{
// 这个地方左边记得是将i的父亲指向j的父亲,错好几次了
father[find(father, i)] = find(father, j);
}
public int find(int[] father, int i)
{
while(father[i] != i)
{
father[i] = find(father, father[i]);
i = father[i];
}
return father[i];
}
}