脑洞解法

原题如下:

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

有效的表达式需遵循以下约定:

“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式expr进行逻辑非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对2个或以上内部表达式expr1, expr2, …进行逻辑与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对2个或以上内部表达式expr1, expr2, …进行逻辑或的运算(OR)

示例:
输入:expression = “|(&(t,f,t),!(t))”
输出:false

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression

正经做法应该是用栈去解析字符串。但实际上题中对于布尔表达式的定义与开发语言中的表达式类似,同时很多开发语言是带有eval函数的(比如Python),可以把字符串当作代码语句来执行。因此可以取巧来做:

  • 我们把题中定义的布尔表达式转换为Python的正经表达式s
  • 使用eval(s)来求得表达式的布尔结果

理论存在,实践开始:

  • 题中&(t, f)和|(f, t)和Python函数调用格式类似,编两个函数,并把&和|替换成函数名
  • t替换成True,f替换成False
  • !替换成not
  • eval(替换好的字符串)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution:
def parseBoolExpr(self, expression: str) -> bool:
def func_and(*args) -> bool:
res = True
for i in args:
res = res and i
return res

def func_or(*args) -> bool:
res = False
for i in args:
res = res or i
return res

s = expression.replace('t', 'True').replace('f', 'False').replace('!', 'not') \
.replace('&', 'func_and').replace('|', 'func_or')
return eval(s)

Py里的一些注意点

另外mark一下,Python里,逻辑运算符的结果并不是布尔类型。

对于and来说:

  • 当and两边条件为“真”时,返回的是and右边的值
  • 当and两边条件为“一真一假”时,返回的是条件为“假”的值
  • 当and两边条件都为“假”时,返回的是and左边的值

对于or来说:

  • 当or两边条件都为“真”时,返回的是or左边的值
  • 当or两边条件为“一真一假”时,返回的是条件为“真”的值
  • 当or两边条件都为“假”时,返回的是or右边的值