【每日一题】bool 表达式解析

给定一个包含 0、1、&、|、^ 的字符串 express,求达到特定布尔值 desired 的组合数量。例如,对于 Express='1^0|0|1' 和 desired=false,有2种组合满足条件。分析表明,字符串长度必须为奇数,且可以通过动态规划进行优化,使用两个 dp 数组分别对应 desired 的两种状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个只由 0(假)、1 (真)、&(逻辑与)、|(逻辑或)、^(s)五种字符组成的字符串 express,再给定一个布尔值 desired。返回 express 能有多少种组合方式,可以达到 desired 的结果。
【举例】
Express = “1^0|0|1”,desired = false
只有 1^((0|0)|1) 和 (1^0|(0|1)) 的组合可以得到 false ,返回 2
无组合可以得到 false ,返回 0

以下 a = 0 ;b = 1

验证 express 正确性:

  1. 长度必须是奇数:a ^ b 或者 a ^ b | a
  2. 偶数位是 a 或者 b,奇数位是运算符

在这里插入图片描述

可能性分析:
在这里插入图片描述

# 校验 exp 正确性
def is_valid(exp):
    n = len(exp)
    # exp 长度必须奇数
    if n % 2 == 0: return False

    # 偶数位必须是 0 或者 1
    for i in range(0, n, 2):
        if exp[i] != "0" and exp[i] != "1":
            return False

    # 奇数位必须是 ^ | &
    for i in range(1, n, 2):
        if exp[i] != "^" and exp[i] != "|" and exp[i] != "&":
            return False

    return True


# 主函数
def express01(exp, desired):
    if not exp: return 0

    if not is_valid(exp): return 0

    return process(exp, desired, 0, len(exp) - 1)


# L R 一定不要压中逻辑符号
def process(exp, desired, L, R):
    # base_case 当 L == R 时,没有操作符只是 0 或者 1
    if L == R:
        if desired:
            return 1 if exp[L] == "1" else 0
        else:
            return 1 if exp[L] == "0" else 0

    res = 0
    if desired:
        # 逐个尝试操作符
        for i in 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值