题目:
给定一个由表示变量之间关系的字符串方程组成的数组,
每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。
在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。
只有当可以将整数分配给变量名,
以便满足所有给定的方程时才返回 true,否则返回 false。
示例 1:
输入:["a==b","b!=a"]
输出:false
解释:如果我们指定,a = 1 且 b = 1,那么可以满足第一个方程,但无法满足第二个方程。没有办法分配变量同时满足这两个方程。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/satisfiability-of-equality-equations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
答案:
时间:
5分钟,unionfind 可以copy 模板
class UnionFind:
def __init__(self,n):
self.parent = [i for i in range(n)]
self.rank = [1 for _ in range(n)]
self.count = n
def find(self,p):
while self.parent[p] != self.parent[self.parent[p]]:
self.parent[p] = self.parent[self.parent[p]]
return self.parent[p]
def union(self,p,q):
i = self.find(p)
j = self.find(q)
if i == j:
return
if self.rank [i] < self.rank [j]:
self.parent[i] = j
self.rank [j] += self.rank [i]
else:
self.parent[j] = i
self.rank [i] += self.rank [j]
self.count -= 1
class Solution:
def equationsPossible(self, equations: List[str]) -> bool:
equa=UnionFind(1050)
visit={}
for x, logo, _,y in equations:
if x not in visit:
visit[x]=len(visit)+1
if y not in visit:
visit[y]=len(visit)+1
if logo=="=":
equa.union(visit[x],visit[y])
for x ,logo,_,y in equations:
if logo=="!":
if equa.find(visit[x])==equa.find(visit[y]):
return False
return True