此题解采用动态规划的方式来解决问题。定义dp[i][j][0]和dp[i][j][1]为布尔表达式从索引i到j计算结果为False和True的方法数。初始化时,如果字符是'0'或'1',则相应的dp[i][i][0]或dp[i][i][1]设为1。对于表达式中的每个可能的子段,使用变量k遍历所有可能的操作符位置,根据操作符的类型(AND、OR、XOR),更新dp数组。例如,对于AND操作,当两边都为True时结果才为True;对于OR操作,任意一边为True结果即为True;对于XOR操作,两边不同结果才为True。这样从最小的子表达式逐步扩大范围,直至得出整个表达式的结果。
时间复杂度: O(n^3)
空间复杂度: O(n^2)
class Solution:
def countEval(self, s: str, result: int) -> int:
n = len(s)
dp = [[[0] * 2 for _ in range(n)] for _ in range(n)]
for i in range(len(s)):
if s[i] in ['0', '1']:
dp[i][i][ord(s[i])-ord('0')] = 1
for l in range(2, len(s) + 1, 2):
for i in range(0, len(s) - l + 1, 2):
j = i + l
for k in range(i + 1, j, 2):
if s[k] == '&':
dp[i][j][1] += dp[i][k - 1][1] * dp[k + 1][j][1]
dp[i][j][0] += dp[i][k - 1][1] * dp[k + 1][j][0] + dp[i][k - 1][0] * dp[k + 1][j][1] + dp[i][k - 1][0] * dp[k + 1][j][0]
elif s[k] == '|':
dp[i][j][1] += dp[i][k - 1][1] * dp[k + 1][j][0] + dp[i][k - 1][0] * dp[k + 1][j][1] + dp[i][k - 1][1] * dp[k + 1][j][1]
dp[i][j][0] += dp[i][k - 1][0] * dp[k + 1][j][0]
elif s[k] == '^':
dp[i][j][0] += dp[i][k - 1][0] * dp[k + 1][j][0] + dp[i][k - 1][1] * dp[k + 1][j][1]
dp[i][j][1] += dp[i][k - 1][1] * dp[k + 1][j][0] + dp[i][k - 1][0] * dp[k + 1][j][1]
return dp[0][n - 1][result]