• 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
    
    • 1

    这时候遇到了第一个右括号),我们将栈中元素出栈并统计,直到栈顶元素为运算符

    [ &tft|
    
    • 1

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

    [ &tftt
    
    • 1

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

    继续遍历字符串

    [ &tfttt!f
    
    • 1

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

    [ &tfttt!
    
    • 1

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

    [ &tftttt
    
    • 1

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

    [ &
    
    • 1

    此时栈顶元素为&5t1f相与的结果为f

    [ f
    
    • 1

    字符串遍历结束,返回栈顶元素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';
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    同步发文于CSDN,原创不易,转载请附上原文链接哦~
    Tisfy:https://letmefly.blog.csdn.net/article/details/127700117

  • 相关阅读:
    数据结构:树形数据结构
    2024-06-12 问AI: 在大语言模型中,什么是Jailbreak漏洞?
    mysql-面试题
    【开卷数据结构 】2-3树
    数据库表字段以表格形式写入Word
    极大似然函数和似然函数的区别
    mdbook安装使用实录
    JWT安全及案例实战
    【信息论与编码基础】第4章 信源压缩编码基础
    蓝桥杯 危险系数 图算法
  • 原文地址:https://blog.csdn.net/Tisfy/article/details/127700117