class Solution:
def countEval(self, s: str, result: int) -> int:
self.ops = {
'&':{
True:[(True,True)],
False:[(True,False),(False,True),(False,False)]
},
'|':{
True:[(True,False),(False,True),(True,True)],
False:[(False,False)]
},
'^':{
True:[(True,False),(False,True)],
False:[(True,True),(False,False)]
}
}
return self.dfs(s,result,{})
def dfs(self,expression,result,memo):
# 查询备忘录,有结果则直接返回
if (expression,result) in memo:
return memo[(expression,result)]
# 如果表达式只有一个值,判断布尔值和期望的结果是否相同
if len(expression) == 1:
val = int(expression)
return int(bool(val) == result)
# 递归计算左右
total = 0
for i in range(len(expression)):
# 遍历字符串的每个值
if expression[i] in self.ops:
for lr,rr in self.ops[expression[i]][result]:
total += self.dfs(expression[:i],lr,memo)*self.dfs(expression[i+1:],rr,memo)
memo[(expression,result)] = total
return total
每日一道Leetcode - 面试题 08.14. 布尔运算【递归】
最新推荐文章于 2024-07-24 14:54:00 发布