Title

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

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

示例 1:

输入:["a==b","b!=a"]
输出:false

解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程。

示例 2:

输出:["b==a","a==b"]
输入:true

解释:我们可以指定 a = 1 且 b = 1 以满足满足这两个方程。

示例 3:*

输入:["a==b","b==c","a==c"]
输出:true

示例 4:

输入:["a==b","b!=c","c==a"]
输出:false

示例 5:

输入:["c==c","b==d","x!=z"]
输出:true

提示:

1 <= equations.length <= 500
equations[i].length == 4
equations[i][0] 和 equations[i][3] 是小写字母
equations[i][1] 要么是 ‘=’,要么是 ‘!’
equations[i][2] 是 ‘=’

Solve

并查集

可以将每一个变量看作图中的一个节点,把相等的关系==看作是两个节点的边,由于表示相等关系的等式方程具有传递性,即所有相等的变量属于同一个连通分量,因此可以使用并查集来维护这种连通分量。

首先遍历所有的等式,构造并查集,同一个等式中的两个变量属于同一个连通分量,因此将两个变量进行合并。

然后遍历所有的不等式,同一个不等式中的两个变量不能属于同一个连通分量,因此对两个变量分别查找其所在的连通分量,如果两个变量在同一个连通分量中,则产生矛盾,返回False

如果遍历完所有的不等式没有发现矛盾,则返回True

具体实现方面,使用一个数组 parent 存储每个变量的连通分量信息,其中的每个元素表示当前变量所在的连通分量的父节点信息,如果父节点是自身,说明该变量为所在的连通分量的根节点。

一开始所有变量的父节点都是它们自身。对于合并操作,我们将第一个变量的根节点的父节点指向第二个变量的根节点;对于查找操作,我们沿着当前变量的父节点一路向上查找,直到找到根节点。

复杂度分析

时间复杂度:O(n+ClogC),其中 n 是 equations 中的方程数量,C 是变量的总数,在本题中变量都是小写字母,即 C≤26。上面的并查集代码中使用了路径压缩优化,对于每个方程的合并和查找的均摊时间复杂度都是 O(logC)。由于需要遍历每个方程,因此总时间复杂度是 O(n+ClogC)。

空间复杂度:O©。创建一个数组 parent 存储每个变量的连通分量信息,由于变量都是小写字母,因此 parent 是长度为 C。

Code

class Solution:class UnionFind:def __init__(self):self.parent = list(range(26))def find(self, index):if index == self.parent[index]:return indexself.parent[index] = self.find(self.parent[index])return self.parent[index]def union(self, index1, index2):self.parent[self.find(index1)] = self.find(index2)def equationsPossible(self, equations: List[str]) -> bool:uf = Solution.UnionFind()for item in equations:if item[1] == '=':index1 = ord(item[0]) - ord("a")index2 = ord(item[3]) - ord("a")uf.union(index1, index2)for item in equations:if item[1] == '!':index1 = ord(item[0]) - ord("a")index2 = ord(item[3]) - ord("a")if uf.find(index1) == uf.find(index2):return Falsereturn True

990. Satisfiability of Equality Equations相关推荐

  1. #990 Satisfiability of Equality Equations

    Description You are given an array of strings equations that represent relationships between variabl ...

  2. word文档封面免费下载_为Word 2007文档添加封面

    word文档封面免费下载 I've been using Microsoft Word since 1985, starting with Word for Mac and eventually mo ...

  3. 如何快速准备面试中的算法,获得 Offer?

    如何快速准备面试中的算法,获得 Offer? 现如今越来越多的公司在面试过程中会考察数据结构和算法.在最近几年,难度颇有上升趋势.因此作为求职者,在面试前刷刷题似乎已经成为准备过程中必不可少的环节了. ...

  4. Optimal Trajectory Generation for Autonomous Vehicles Under Centripetal Acceleration Constraint [翻译]

    Optimal Trajectory Generation for Autonomous Vehicles Under Centripetal Acceleration Constraints for ...

  5. 990. 等式方程的可满足性

    链接:990. 等式方程的可满足性 题解:https://www.yuque.com/liweiwei1419/algo/gq157y class Solution {public:vector< ...

  6. 【Applied Algebra】求解布尔方程(Boolean Equations)的4个高效baseline算法

    求解布尔方程(Boolean Equations)的4个高效baseline算法 求解布尔方程(Boolean Equations)是理论计算机中的基本问题之一;事实上,求解Fq\mathbb{F}_ ...

  7. AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY

    AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY 监测两性平等的开源说话人性别检测框架 ...

  8. Linear equations

    In mathematics, a linear equation is an equation that may be put in the form a 1 x 1 + - + a n x n + ...

  9. Linear-time zero-knowledge proofs for arithmetic circuit satisfiability 学习笔记

    1. 引言 Bootle等人2017年论文<Linear-time zero-knowledge proofs for arithmetic circuit satisfiability> ...

最新文章

  1. CakePHP中文手册【翻译】-请求处理组件
  2. UVA 10479 The Hendrie Sequence
  3. bzoj千题计划128:bzoj4552: [Tjoi2016Heoi2016]排序
  4. python就业方向有哪些-Python的就业方向有哪些?薪资都是多少?
  5. 五步让你玩转CocoaPods
  6. 7-7 字符串修改 (15 分)
  7. javaScript解决Form的嵌套
  8. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了
  9. C++生成简单WAV文件(一)
  10. Git(8)-- 撤消操作(git commit --amend、git reset 和 git checkout 命令详解)
  11. 资源 | 有了这些字体,你的设计也立即“高大上”起来。
  12. 分布式对象存储解决方案
  13. 一文看懂有刷电机与无刷电机的工作原理及区别
  14. 使用ROS提取udacity .bag文件中的压缩图片
  15. C#实现简单气泡屏保(二)
  16. keil ARM 生成BIN文件的两种方式,直接复制就能用
  17. 阿里云盾(云安全)是什么?有什么作用?
  18. Python输入账号密码判断是否正确并输出,典型案例-百钱买百鸡的两个程序代码
  19. 标准差-standard deviation
  20. Xshell连接不上虚拟机

热门文章

  1. vue脚手架中使用axios
  2. Spring boot集成spring-boot-starter-data-jpa环境搭建
  3. 关于编辑器对input标签报错提示“表单输入没有相关label”的问题
  4. Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式
  5. Go丨语言学习笔记--func
  6. html中什么标签可作容器,HTML容器标签和文本标签
  7. vuex刷新页面数据丢失怎么解决_你是否真正了解Vuex
  8. linux后缀为tar.xz,xz后缀名文件解压方法
  9. 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
  10. python交互模式切换_Python 交互式窗口 (REPL) - Visual Studio | Microsoft Docs