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|

共出栈了1t1f,此时栈顶元素为运算符|1t1f相或的结果为t,运算符出栈,t入栈

[ &tftt

至此,由&tft|tf&tftt,我们实际上是将|tf转换成了t

继续遍历字符串

[ &tfttt!f

此时我们遇到了第二个右括号),我们将出栈1f

[ &tfttt!

!f的结果是t,将|出栈并将t入栈

[ &tftttt

继续遍历字符串,我们遇到了最右一个右括号),我们将出栈5t1f

[ &

此时栈顶元素为&5t1f相与的结果为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.计算布尔表达式的值

Leetcode 1106. Parsing A Boolean Expression

LeetCode(数据库)- 计算布尔表达式的值

用正则表达式解析布尔算术,包括括号?

LeetCode 227. 基本计算器 (Java)