【LeetCode】Day175-解析布尔表达式

题目

1106. 解析布尔表达式【困难】

题解

类比四则运算表达式,用来解决

如果当前字符是:

  • ‘,’:跳过
  • ‘,’和 ‘)’外的其他字符:入栈
  • ‘)’:意味着表达式结束,将解析结果入栈
    1、栈内字符依次出栈,直到栈顶为左括号,然后将左括号和运算符弹出,记录弹出的“t”和“f”个数
    2、根据运算符以及“t”和“f”的个数计算表达式的值,并将表达式的值添加到栈内:
    如果运算符是‘!(逻辑非)’,表达式的值为括号内的值取反,f 数目为1时结果为 t ,否则为 f
    如果运算符是‘&(逻辑与)’,括号内所有值都是 t 结果为 t ,否则为 f
    如果运算符是‘|(逻辑或)’,括号内有一个值为 t ,结果为 t ,否则为 f

遍历结束后,栈内只有一个字符,t 或者 f,根据该字符返回结果

class Solution {
    public boolean parseBoolExpr(String expression) {
        int n=expression.length();
        Deque<Character>stack=new ArrayDeque<>();
        for(int i=0;i<n;i++){
            char ch=expression.charAt(i);
            //跳过逗号
            if(ch==',')
                continue;
            //遇到右括号
            else if(ch==')'){
                int t=0,f=0;
                //计算括号内t和f数目
                while(!stack.isEmpty()&&stack.peek()!='('){
                    char tmp=stack.poll();
                    if(tmp=='t')    t++;
                    else    f++;
                }
                stack.poll();//弹出左括号
                char op=stack.poll();//弹出运算符
                //根据运算符判断表达式结果,并存入栈中
                if(op=='!'){
                    if(f>0) stack.push('t');
                    else    stack.push('f');
                }
                else if(op=='&'){
                    if(f>0) stack.push('f');
                    else    stack.push('t');
                }
                else if(op=='|'){
                    if(t>0) stack.push('t');
                    else    stack.push('f');
                }
            }
            //其他符号入栈
            else
                stack.push(ch);
        }
        return stack.poll()=='t';
    }
}

这题根据思路代码还是很简单的,自己ac了~

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

ps. 今天居然刷到了某同学的leetcode,有760+道了,太强了,士别三日当刮目相待了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值