【Lintcode】1908. Boolean Expression Evaluation

题目地址:

https://www.lintcode.com/problem/1908/description

给出一个布尔表达式 s s s,以字符串形式给出,求其值。如果该表达式不合法,返回"error"。注意"and"运算符比"or"高级。题目保证该表达式里只含"and""or"运算。

思路是单调栈。但是这里由于只有两个运算,而且and更优先,所以遇到or的时候可以直接进栈,遇到and的时候可以立即将栈顶与后面的布尔值做与运算再push进栈。最后将栈内元素全部or一遍即得结果。当然一开始需要看一下表达式是否合法,先将 s s s对空格做split,如果首尾是运算符则非法,如果中间有连续的两个运算符或者连续两个布尔值也非法。代码如下:

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.List;

public class Solution {
    /**
     * @param expression: a string that representing an expression
     * @return: the result of the expression
     */
    public String evaluation(String expression) {
        // write your code here
        List<String> list = Arrays.asList("true", "false");
        String[] strs = expression.split(" ");
        if (!list.contains(strs[0]) || !list.contains(strs[strs.length - 1])) {
            return "error";
        }
        
        for (int i = 1; i < strs.length; i++) {
            if (list.contains(strs[i]) == list.contains(strs[i - 1])) {
                return "error";
            }
        }
    
        Deque<Boolean> stk = new ArrayDeque<>();
        for (int i = 0; i < strs.length; i++) {
            if (list.contains(strs[i])) {
                stk.push("true".equals(strs[i]));
            } else {
                if ("and".equals(strs[i])) {
                    stk.push(stk.pop() && "true".equals(strs[i + 1]));
                    i++;
                }
            }
        }
        
        while (!stk.isEmpty()) {
            if (stk.pop()) {
                return "true";
            }
        }
        
        return "false";
    }
}

时空复杂度 O ( l s ) O(l_s) O(ls)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值