LeetCode每日一题——1106. 解析布尔表达式

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。有效的表达式需遵循以下约定:

题目

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

  • “t”,运算结果为 True
  • “f”,运算结果为 False
  • “!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
  • “&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑与的运算(AND)
  • “|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑或的运算(OR)

示例

示例 1:

输入:expression = “!(f)”

输出:true

示例 2:

输入:expression = “|(f,t)”

输出:true

示例 3:

输入:expression = “&(t,f)”

输出:false

示例 4:

输入:expression = “|(&(t,f,t),!(t))”

输出:false

提示:

1 <= expression.length <= 20000

expression[i] 由 {‘(’, ‘)’, ‘&’, ‘|’, ‘!’, ‘t’, ‘f’, ‘,’} 中的字符组成。

expression 是以上述形式给出的有效表达式,表示一个布尔值。

思路

  • 遇到带有括号的题第一时间应该就想到栈
  • 这里使用栈signals记录所有运算符号,用栈number记录所有的操作数
  • 遍历一遍给定的expression,可能会遇到以下情况
  • 遇到’!‘或’&‘或’|',这几个就是运算符号,我们直接依次压入栈signals中
  • 遇到’t’或’f’,这俩是操作数,我们可以依次压入number中
  • 遇到’(',左括号作为分割与前一个括号的分隔符,我们可以向栈number中压入空字符串来辨识
  • 遇到’)',遇到右括号证明我们要向前方直至上一个分隔符进行运算了,这时候对应signals的栈顶元素也就是我们所需要的运算符号,我们弹出signals的栈顶元素记作signal。然后依次弹出number中的元素(直到遇到空字符串停止)做signal运算,最后删除分隔符,将运算结果再压入栈中供后面使用即可
  • 直到遍历完给定expression中的元素,number栈中必定只剩下最后一个结果元素,返回即可

题解

class Solution:
    def parseBoolExpr(self, expression: str) -> bool:
      # 定义运算符号和操作数栈
        signals = []
        number = []
        # 遍历
        for i in expression:
          # 遇到运算符
            if i in '!|&':
                signals.append(i)
            # 遇到操作数
            elif i == 't' or i == 'f':
              # 注意压入的是True和False
                number.append(True if i == 't' else False)
            # 遇到右括号
            elif i == ')':
              # 弹出运算符
                signal = signals.pop()
                # 下面分情况进行运算
                tmp = number.pop()
                # !直接取反即可,但是要先删除空字符串
                if signal == '!':
                    number.pop()
                    number.append(not tmp)
                elif signal == '&':
                  # 弹到分隔符为止,下同理
                    while number[-1] !='':
                        tmp_ = number.pop()
                        tmp = tmp and tmp_
                    number.pop()
                    number.append(tmp)
                else:
                    while number[-1] != '':
                        tmp_ = number.pop()
                        tmp = tmp or tmp_
                    number.pop()
                    number.append(tmp)
            # 遇到左括号
            elif i == '(':
                number.append('')
        # 返回number首元素即可
        return number[0]


目录
相关文章
|
21天前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
91 52
|
2月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
4月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
3月前
|
分布式计算 Java API
深入解析Java中的Lambda表达式及其应用
本文将深入探讨Java中Lambda表达式的定义、优势及其在实际编程中的应用。通过具体示例,帮助读者更好地理解和使用这一强大的编程工具。
|
5月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
4月前
|
JSON 数据格式 索引
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
61 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
124 2

推荐镜像

更多