题目:
思路:
这是一道并查集的板子,==号我们可以认为两个字母之间存在一条边,先遍历一遍把所有 == 的字母进行连接,然后再次遍历看一下不相等的字母是否在一个连通分量上,那么主要就是怎么连接以及怎么去判断两个字母是否在同一个连通分量上.
并查集讲解:https://blog.csdn.net/weixin_42134034/article/details/106621886
代码:
class Solution {
public:
int father[26];
bool equationsPossible(vector<string>& equations) {
//并查集
//等于,则都应属于同一个集合,把等于两边的都放一个集合
//然后看不等于两边的元素,是不是出现在同一个集合,如果有在一个集合的就是false
if(equations.empty()) return true;
//if(equations.size()==1) return true;
//父亲先指向自己
for(int i = 0; i < 26; i ++){
father[i] = i;
}
for(int i = 0; i < equations.size(); i ++){
if(equations[i][1] == '='){//等于,合并集合
int fa1 = find(equations[i][0] - 'a');
int fa2 = find(equations[i][3] - 'a');
if(fa1 != fa2) father[fa1] = fa2;
}
}
for(int i = 0; i < equations.size(); i ++){
if(equations[i][1] == '!'){
int fa1 = find(equations[i][0] - 'a');
int fa2 = find(equations[i][3] - 'a');
if(fa1 ==fa2) return false;
}
}
return true;
}
//找根节点
int find(int i){
//int fa = i;
while(i != father[i]){
father[i] = father[father[i]];//顺便就路径压缩了
i = father[i];
}
return i;
}
};