给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。
from collections import defaultdict
class Solution:
def __init__(self):
"""
三维动态规划就不用数组了,从上到下进行递归运算
"""
self.dp = defaultdict(int)
def countEval(self, s: str, result: int) -> int:
return self.helper(s, 0, len(s) - 1, result)
def helper(self, s, i, j, result):
if (i, j, result) in self.dp:
return self.dp[i, j, result]
if i == j:
if int(s[i]) == result:
return 1
return 0
for k in range(i, j, 2):
ope = s[k + 1]
for val1 in {0, 1}:
for val2 in {0, 1}:
if self.get_res(val1, val2, ope) == result:
self.dp[i, j, result] += self.helper(s, i, k, val1) * self.helper(s, k + 2, j, val2)
return self.dp[i, j, result]
def get_res(self, val1, val2, ope):
if ope == '&':
return val1 and val2
elif ope == '|':
return val1 or val2
return val1 ^ val2