990. Satisfiability of Equality Equations
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相关推荐
- #990 Satisfiability of Equality Equations
Description You are given an array of strings equations that represent relationships between variabl ...
- word文档封面免费下载_为Word 2007文档添加封面
word文档封面免费下载 I've been using Microsoft Word since 1985, starting with Word for Mac and eventually mo ...
- 如何快速准备面试中的算法,获得 Offer?
如何快速准备面试中的算法,获得 Offer? 现如今越来越多的公司在面试过程中会考察数据结构和算法.在最近几年,难度颇有上升趋势.因此作为求职者,在面试前刷刷题似乎已经成为准备过程中必不可少的环节了. ...
- Optimal Trajectory Generation for Autonomous Vehicles Under Centripetal Acceleration Constraint [翻译]
Optimal Trajectory Generation for Autonomous Vehicles Under Centripetal Acceleration Constraints for ...
- 990. 等式方程的可满足性
链接:990. 等式方程的可满足性 题解:https://www.yuque.com/liweiwei1419/algo/gq157y class Solution {public:vector< ...
- 【Applied Algebra】求解布尔方程(Boolean Equations)的4个高效baseline算法
求解布尔方程(Boolean Equations)的4个高效baseline算法 求解布尔方程(Boolean Equations)是理论计算机中的基本问题之一;事实上,求解Fq\mathbb{F}_ ...
- AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY
AN OPEN-SOURCE SPEAKER GENDER DETECTION FRAMEWORK FOR MONITORING GENDER EQUALITY 监测两性平等的开源说话人性别检测框架 ...
- 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 + ...
- Linear-time zero-knowledge proofs for arithmetic circuit satisfiability 学习笔记
1. 引言 Bootle等人2017年论文<Linear-time zero-knowledge proofs for arithmetic circuit satisfiability> ...
最新文章
- CakePHP中文手册【翻译】-请求处理组件
- UVA 10479 The Hendrie Sequence
- bzoj千题计划128:bzoj4552: [Tjoi2016Heoi2016]排序
- python就业方向有哪些-Python的就业方向有哪些?薪资都是多少?
- 五步让你玩转CocoaPods
- 7-7 字符串修改 (15 分)
- javaScript解决Form的嵌套
- notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了
- C++生成简单WAV文件(一)
- Git(8)-- 撤消操作(git commit --amend、git reset 和 git checkout 命令详解)
- 资源 | 有了这些字体,你的设计也立即“高大上”起来。
- 分布式对象存储解决方案
- 一文看懂有刷电机与无刷电机的工作原理及区别
- 使用ROS提取udacity .bag文件中的压缩图片
- C#实现简单气泡屏保(二)
- keil ARM 生成BIN文件的两种方式,直接复制就能用
- 阿里云盾(云安全)是什么?有什么作用?
- Python输入账号密码判断是否正确并输出,典型案例-百钱买百鸡的两个程序代码
- 标准差-standard deviation
- Xshell连接不上虚拟机
热门文章
- vue脚手架中使用axios
- Spring boot集成spring-boot-starter-data-jpa环境搭建
- 关于编辑器对input标签报错提示“表单输入没有相关label”的问题
- Gradient Boost Decision Tree(GBDT)中损失函数为什么是对数形式
- Go丨语言学习笔记--func
- html中什么标签可作容器,HTML容器标签和文本标签
- vuex刷新页面数据丢失怎么解决_你是否真正了解Vuex
- linux后缀为tar.xz,xz后缀名文件解压方法
- 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
- python交互模式切换_Python 交互式窗口 (REPL) - Visual Studio | Microsoft Docs