美文网首页
golang leetcode 1106 解析布尔表达式

golang leetcode 1106 解析布尔表达式

作者: Tibbersshao | 来源:发表于2019-07-03 10:15 被阅读0次

根据题意我们可以知道,一个运算符一定会跟随一对括号,比如 !(t)。
所以我们可以直接判断expression[0],得到最外层的运算符,根据运算符处理内层的表达式。

  1. 如果不是运算符,肯定就是 't'或者 'f' 直接判断即可
  2. 如果是't',里面要么就是单一的字符,要么就是一个新的表达式。再调用parseBoolExpr解析并取反即可。
  3. 如果是 '&' 或者 '|', 需要对里面每个表达式分别求解。通过括号匹配,拿到第一个'('匹配的')'里面的表达式,再通过 parseBoolExpr 计算出值。
  4. 在计算 '&' 的时候,如果有一个值为false,可以提前结束计算。同理,在计算'|'时, 如果有一个值为true,也可以提前结束计算。

完整代码见下:

func parseBoolExpr(expression string) bool {
    start, end := 2, len(expression)-1
    switch expression[0] {
    case '!':
        return Not(expression[start:end])
    case '&':
        return AndOr(expression[start:end], true)
    case '|':
        return AndOr(expression[start:end], false)
    default:
        return expression == "t"
    }
}

// flag &: true |: false
func AndOr(exp string, flag bool) bool {
    pre, idx := 0, 0
    for i := 0; i < len(exp); i++ {
        if exp[i] == '(' {
            if pre == 0 {
                idx = i
            }
            pre++
        } else if exp[i] == ')' {
            pre--
            if pre == 0 {
                t := parseBoolExpr(exp[idx-1 : i+1])
                if !t && flag {
                    return false
                }
                if t && !flag {
                    return true
                }
            }
        } else {
            if pre <= 0 {
                if exp[i] == 'f' && flag {
                    return false
                }
                if exp[i] == 't' && !flag {
                    return true
                }
            }
        }
    }
    return flag
}

func Not(exp string) bool {
    if len(exp) == 1 {
        return !(exp == "t")
    }
    return !parseBoolExpr(exp)
}

相关文章

  • golang leetcode 1106 解析布尔表达式

    根据题意我们可以知道,一个运算符一定会跟随一对括号,比如 !(t)。所以我们可以直接判断expression[0]...

  • LeetCode #1106 Parsing A Boolean

    1106 Parsing A Boolean Expression 解析布尔表达式 Description:Ret...

  • leetcode 1106 解析布尔表达式

    难度:困难 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。有...

  • 5章 布尔表达式

    本章大纲 布尔类型 布尔表达式 布尔操作符 布尔类型 布尔类型:只有2中结果:真 假 布尔表达式 布尔表达式 ...

  • Golang流程控制

    Golang流程控制 Golang当中的流程控制ifif语句由一个布尔表达式后紧跟一个或多个语句组成Go变成语言种...

  • 运算符

    运算符 逻辑运算符 与语法:布尔值(表达式) && 布尔值(表达式) 或语法:布尔值(表达式) || 布尔值(表达...

  • 关于if(xx)和 a==b的判断

    if(xx) 经常会遇到if(xx)的判断解析:对于对于括号里的表达式,会被强制转换为布尔类型。 a==b 对于a...

  • golang 正则正则表达式反向查询

    golang 正则正则表达式反向查询 基本上所有的语言都有正则表达式,golang也不例外。golang原生使用r...

  • 工具与文章收集

    golang开源项目速查表 goland快捷键 在线画图工具 leetcode golang中文文档 golang...

  • 字符串

    剑指offer所有的题目总结 牛客 正则表达式的匹配 leetcode的题目,解析描述更加全面 https://l...

网友评论

      本文标题:golang leetcode 1106 解析布尔表达式

      本文链接:https://www.haomeiwen.com/subject/qpwmvxtx.html