zoukankan      html  css  js  c++  java
  • 【LeetCode每日一题】2020.6.8 990. 等式方程的可满足性

    990. 等式方程的可满足性

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

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

    示例:

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

    输入:["a==b","b!=a"]
    输出:false
    解释:我们可以指定 a = 1 且 b = 1 以满足满足这两个方程

    分析:

    ​ 题目示例中给出的解释有一些误导的感觉。我们不需要通过实际赋值来判断方程是否成立。其实这道题目就是判断等号的传递性。等号的传递可以看作图的连通关系,进而我们可以想到一种简洁优雅的数据结构——并查集。关于并查集可以看这里,我就不再多说。

    from typing import List
    
    
    class UnionFind:
        def __init__(self):
            self.parent = list(range(26))
            self.rank = [0] * 26
    
        def find(self, i):
            if i == self.parent[i]:
                return i
            self.parent[i] = self.find(self.parent[i])
            return self.parent[i]
    
        def union(self, x, y):
            # 按秩合并
            rx, ry = self.find(x), self.find(y)
            if self.rank[rx] <= self.rank[ry]:
                self.parent[rx] = ry
            else:
                self.parent[ry] = rx
            if self.rank[rx] == self.rank[ry] and rx != ry:
                self.rank[ry] += 1
    
    
    class Solution:
        def equationsPossible(self, equations: List[str]) -> bool:
            uf = UnionFind()
            for st in equations:
                if st[1] == '=':
                    index1 = ord(st[0]) - ord('a')
                    index2 = ord(st[3]) - ord('a')
                    uf.union(index1, index2)
            for st in equations:
                if st[1] == '!':
                    index1 = ord(st[0]) - ord('a')
                    index2 = ord(st[3]) - ord('a')
                    if uf.find(index1) == uf.find(index2):
                        return False
            return True
    

    总结:

    ​ 并查集的应用主要在判断图的连通性上,包括应用在Kruskal算法(求取最小生成树)中。这道题的关键在于没有确切的给出图或树的定义,需要自己看出判断连通性的需求。

  • 相关阅读:
    unity_动画_状态机
    有内涵的技术论坛
    ios开发——常用经典算法OC篇&冒泡/快速
    iOS开发——C篇&文件操作
    iOS开发——C篇&预处理
    iOS开发——C篇&结构体与枚举
    iOS开发——C篇&函数解析
    iOS开发——C篇&动态内存分析
    UML第二次作业(代码互评)
    我与UML相爱相杀的狗血日常
  • 原文地址:https://www.cnblogs.com/enmac/p/13064339.html
Copyright © 2011-2022 走看看