LeetCode 1106. 解析布尔表达式
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 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
都入栈,遇到(,
不用管,直到遇到右括号开始计算
[ &tft|tf
这时候遇到了第一个右括号)
,我们将栈中元素出栈并统计,直到栈顶元素为运算符
[ &tft|
共出栈了1
个t
和1
个f
,此时栈顶元素为运算符|
,1
个t
和1
个f
相或的结果为t
,运算符出栈,t
入栈
[ &tftt
至此,由&tft|tf
到&tftt
,我们实际上是将|tf
转换成了t
继续遍历字符串
[ &tfttt!f
此时我们遇到了第二个右括号)
,我们将出栈1
个f
[ &tfttt!
而!f
的结果是t
,将|
出栈并将t
入栈
[ &tftttt
继续遍历字符串,我们遇到了最右一个右括号)
,我们将出栈5
个t
和1
个f
[ &
此时栈顶元素为&
,5
个t
和1
个f
相与的结果为f
[ f
字符串遍历结束,返回栈顶元素f
即为答案
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n为字符串长度
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
bool parseBoolExpr(string& expression)
stack<char> st;
int n = expression.size();
for (int i = 0; i < n; i++)
if (expression[i] == '!' || expression[i] == '&' || expression[i] == '|' || expression[i] == 't' || expression[i] == 'f')
st.push(expression[i]);
else if (expression[i] == ')')
int cntT = 0, cntF = 0;
while (st.top() == 't' || st.top() == 'f')
if (st.top() == 't')
cntT++;
else
cntF++;
st.pop();
char op = st.top();
st.pop();
if (op == '&')
st.push(cntF ? 'f' : 't');
else if (op == '|')
st.push(cntT ? 't' : 'f');
else
st.push(cntT ? 'f' : 't');
// else will be “(”、“,”
return st.top() == 't';
;
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127700117
以上是关于LeetCode 1106. 解析布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode:Database 98.计算布尔表达式的值
LeetCode:Database 98.计算布尔表达式的值