Leetcode 990. 等式方程的可满足性(并查集判断是否处于同一连通分量)

题解

  • 题意:给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。判断关系数组中的所有字符串是否能够形成一个合理的方程式: 比如,输入["a==b","b==c","a==c"],输出true,输入["a==b","b!=c","a==c"],输出false

  • 题解:这题关键在于分开遍历==!=所对应的方程式,如果一个等式全都是不等式或者等式,那么这个逻辑一定是正确的。因此只需要考虑同时存在两种的情况。因为等式是具有传递性的, 因此通过等式,我们可以建立一个变量间的连通分量,然后再遍历不等式,如果不等式两端的变量在连通分量中出现过,那么说明在这个方程数组的逻辑有问题,否则,说明这个数组中的方程式符合传递性原理。

    • 如何构建连通块?
      • 遍历等式,以左边的节点为父节点,构建一个树形连通分量
    • 如何判断两个点是否处于同一个连通分量中?
      • 查看两个节点的祖宗节点是否是同一个节点,这是并查集非常常见的用法
  • 实现,优化并查集,每次连接都将两者的祖宗节点进行拼接,这种做法可以避免自环的出现

class Solution {
    int find(int[]p, int x){
        while(p[x] != x) x = p[x];
        return x;
    }
    public boolean equationsPossible(String[] equations) {
        int []parent = new int[26];
        for(int i = 0;i < 26;i++) parent[i] = i;

        for(String equation:equations){
            char a = equation.charAt(0);
            char b = equation.charAt(3);
            if(equation.charAt(1) == '='){    
                int pb = find(parent, b-'a');
                int pa = find(parent, a-'a');
                parent[pb] = pa;
            }
        }
        for(String equation:equations){
            char a = equation.charAt(0);
            char b = equation.charAt(3);
            if(equation.charAt(1)=='!'){
                if(find(parent, a-'a') == find(parent, b-'a')) return false;
            }
        }
        return true;
    }
}

题目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值