python解力扣1106题

题目

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

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

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

示例 1:

输入:expression = "!(f)"
输出:true
示例 2:

输入:expression = "|(f,t)"
输出:true
示例 3:

输入:expression = "&(t,f)"
输出:false
示例 4:

输入:expression = "|(&(t,f,t),!(t))"
输出:false
 

提示:

1 <= expression.length <= 20000
expression[i] 由 {'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
expression 是以上述形式给出的有效表达式,表示一个布尔值。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

class Solution:
    def parseBoolExpr(self, expression):  # expression是字符串
        stack = []
        for a in expression:
            if a in "tf!|&":
                stack.append(a)
            elif a == ')':
                t = f = 0
                while stack[-1] in 'tf':
                    t += stack[-1] == 't'
                    f += stack[-1] == 'f'
                    stack.pop()
                match stack.pop():
                    case '!':
                        a = 't' if f else "f"
                    case '&':
                        a = 'f' if f else "t"
                    case '|':
                        a = 't' if t else "f"
                stack.append(a)
        return stack[0] == 't'

解析

        对于这个算法题,没学过算法的我开始也不是很会。然后我就先大致看了一眼题解部分。我注意到其他人的题解基本都是用栈来实现的,于是我专门去看了一下B站的算法视频。简单了解了一下栈。但是我依然没有头绪。既然自己写不出来代码,那就由读懂别人的代码开始吧。

        首先创建一个栈stack[]。然后循环字符串将他内部的关键字符全部添加到栈内部。

接着到了关键点,这个代码是从左边向右边遍历,通过遇到')'来进行分区域计算来求答案的。

t=f=0,给初始的t和f数量赋值,然后由于python中True=1,t += stack[-1] == 'tf'可以通过逐步出栈的方式计算一个括号内t和f的数量。

        接着下一步到了match,case这里。这个是python3.10新增的功能,但是很多小伙伴们还在用python3.9和3.8,所以可能自己调试的话你是不会成功的。这个和C语言中的switch和case方法基本上是一个样子的。但是也有一些不同。就让我来给大家说一下它们的不同吧:

1.可以匹配的数据类型不同,C语言中switch和case只能匹配整数型或者字符型。python中的match和case可以是整数、浮点数、元组、列表、字典等

2.多条件匹配,C语言的多条件匹配必须写出case,后面可以不带语句,但是python完全可以用case 1 | 2 | 3 | 4 | 5: 这种写法来实现多条件匹配。

3.通配符匹配,python中的match,case还支持通配符匹配,比如case [1, *args]:

        接下来回到正题,python语法中列表.pop()是删除最后一位并且其返回值就是删除值,然后用match来匹配,然后再计算返回你这个小括号的区域的返回值的t还是f。完后在循环进行上面的操作继续匹配')'直到遍历完字符串expression就可以得到一个只含有一个元素(t或者f)的栈了。最后return其对应的真假。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值