1106.解析布尔表达式
【LetMeFly】1106.解析布尔表达式
力扣题目链接:https://leetcode.cn/problems/parsing-a-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
是以上述形式给出的有效表达式,表示一个布尔值。
方法一:栈
这道题比较好的一点是,基本上不需要考虑运算符的优先级(不像加减乘除那样需要先乘除后加减),因为“&|!”的后面都会跟上一个括号
那么就好办了,遇到运算符&|!
就将运算符入栈,遇到布尔值tf
就将布尔值入栈;
遇到右括号)
就将栈顶的布尔值不断弹出并统计,直到栈顶为运算符,弹出这个运算符并将弹出的布尔值按运算符的规则进行布尔运算,最后将运算结果再入栈即可。
例如 &(t,f,t,|(t,f),t,!(f))
从左到右遍历字符串,遇到&|!tf
都入栈,遇到(,
不用管,直到遇到右括号开始计算
1 |
|
这时候遇到了第一个右括号)
,我们将栈中元素出栈并统计,直到栈顶元素为运算符
1 |
|
共出栈了1
个t
和1
个f
,此时栈顶元素为运算符|
,1
个t
和1
个f
相或的结果为t
,运算符出栈,t
入栈
1 |
|
至此,由&tft|tf
到&tftt
,我们实际上是将|tf
转换成了t
继续遍历字符串
1 |
|
此时我们遇到了第二个右括号)
,我们将出栈1
个f
1 |
|
而!f
的结果是t
,将|
出栈并将t
入栈
1 |
|
继续遍历字符串,我们遇到了最右一个右括号)
,我们将出栈5
个t
和1
个f
1 |
|
此时栈顶元素为&
,5
个t
和1
个f
相与的结果为f
1 |
|
字符串遍历结束,返回栈顶元素f
即为答案
- 时间复杂度$O(n)$,其中$n$为字符串长度
- 空间复杂度$O(n)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127700117
1106.解析布尔表达式
https://blog.letmefly.xyz/2022/11/05/LeetCode 1106.解析布尔表达式/