[LeetCode] 990. 等式方程的可满足性(图,并查集)

990. 等式方程的可满足性

给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。

只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。

在这里插入图片描述
在这里插入图片描述

解题思路: 解此题时,感觉考察的是图和并查集的知识,然后看了一眼标签,判断的没错,但是写代码时,发现思考的点有点混乱,然后看了一下官方的并查集解题思路,尝试着根据解题思路写了一下代码。先写一个标准的并查集模型,然后对等式方程做两次遍历,第一次遍历"==",将相等的元素进行合并,至此并查集就构建完毕了,然后再进行第二次遍历,遍历"!=",遍历的过程中,查找这两个元素的parent是否相同,若相同则直接返回false。

class UnionFind {
public:
    UnionFind() {
        uf.resize(26);
        for (int i = 0; i < 26; ++i) uf[i] = i;
    }
    int Find(int a) {
        while (uf[a] != a) a = uf[a];
        return a;
    }
    void Union(int a, int b) {
        int pa = Find(a);
        int pb = Find(b);
        if (pa < pb) uf[pb] = pa;
        else uf[pa] = pb;
    }
private:
    vector<int> uf;
};
class Solution {
public:
    bool equationsPossible(vector<string>& equations) {
        UnionFind uf;
        for (auto equation : equations) {
            if (equation[1] == '=' && equation[0] != equation[3]) {
                uf.Union(equation[0] - 'a', equation[3] - 'a');
            }
        }
        for (auto equation : equations) {
            if (equation[1] == '!') {
                int p1 = uf.Find(equation[0] - 'a');
                int p2 = uf.Find(equation[3] - 'a');
                if (p1 == p2) return false;
            }
        }
        return true;
    }
};

————————————

参考资料:

https://leetcode-cn.com/problems/satisfiability-of-equality-equations/solution/deng-shi-fang-cheng-de-ke-man-zu-xing-by-leetcode-/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值