Leetcode990. 等式方程的可满足性 C++ 并查集

题目:

在这里插入图片描述

思路:

这是一道并查集的板子,==号我们可以认为两个字母之间存在一条边,先遍历一遍把所有 == 的字母进行连接,然后再次遍历看一下不相等的字母是否在一个连通分量上,那么主要就是怎么连接以及怎么去判断两个字母是否在同一个连通分量上.

并查集讲解: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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值