昨天的每日一题太难了,没费工夫看,就没写题解
package LeetCode.FiveHundredOneToOneThousand;
public class NineHundredAndNinety {
public boolean equationsPossible(String[] equations) {
// 把所有的式子用无向图来表示,用下标和内容来表示他们和它们的父节点
// 最初的父节点是自己,所以要进行初始化,然后把所有图的关系表示进去,下标代表当前节点,内容代表它们的父节点
// 我们知道每个式子的区别就是第二个字符,当有内容在 “==” 和 “!=” 中都出现的话,就说明 false
int len = equations.length;
int[] parent = new int[26];
// 进行初始化
for (int i = 0; i < 26; i ++)
parent[i] = i;
// 将“==”关系录入图中,下标代表当前数字,内容代表父节点(子节点)
for (String str : equations) {
char[] temp = str.toCharArray();
if (temp[1] == '=') {
// 计算当前的式子左右两边的字母
int index1 = temp[0] - 'a';
int index2 = temp[3] - 'a';
// 将 index1 和 index2 建立联系
helper(parent,index1,index2);
}
}
for (String str : equations){
char[] temp = str.toCharArray();
if (temp[1] == '!'){
// 同上
int index1 = temp[0] - 'a';
int index2 = temp[3] - 'a';
// 在这里我们进行判断,如果下面包含上面已经确立的关系,就说明不满足,返回 false
if (find(parent,index1) == find(parent,index2))
return false;
}
}
return true;
}
// 将 1 和 2 建立联系
private void helper(int[] parent,int index1,int index2){
parent[find(parent,index1)] = find(parent, index2);
}
// 找到 parent 中 ind 的父节点(子节点)
private int find(int[] parent, int ind){
while (parent[ind] != ind){
parent[ind] = parent[parent[ind]];
ind = parent[ind];
}
return ind;
}
}