代码随想录算法训练营第十一天

代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

20. 有效的括号

题目链接:有效的括号
这题想的时候其实是想出来了,但实现的时候不是很确定。
他的要求是:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

所以就做一个栈,遍历字符串
如果是左括号,就把对应的左括号入栈;
如果是右括号,
如果此时栈里没有元素就是无对应括号,直接就False,
如果此时栈里有元素但是对不上,也False
如果此时栈里有元素也能对上才可以继续。

整个s遍历完,如果没有剩下的括号,就True;有剩下的就False。

class Solution:
    def isValid(self, s: str) -> bool:
        d = {}
        d['('] = ')'
        d['{'] = '}'
        d['['] = ']'

        stack = []  
        for i in s:
            if i in d:
                stack.append(d[i])
            elif not stack or i != stack[-1]:#如果是i不是左边的stack里也没有配对,就错了
                return False 
            elif i == stack[-1]:
                stack.pop()
            #print(stack)
            
        if not stack:
            return True
        else:
            return False

1047. 删除字符串中的所有相邻重复项

题目链接:删除字符串中的所有相邻重复项
做一个栈,遍历字符串
如果栈是空的,就把元素放进去;
如果栈不是空的,
当前遍历元素和栈里最后一个一样就把栈里一样的pop掉,
如果不一样就就把当前元素放进去。

class Solution:
    def removeDuplicates(self, s: str) -> str:
        stack = []
        for i in s:
            if not stack or i != stack[-1]: #如果是空的
                stack.append(i)
            elif i == stack[-1]:
                stack.pop()
        return ''.join(stack)

150. 逆波兰表达式求值

题目链接:逆波兰表达式求值
首先要处理怎么把字符串运算符号变成真的运算符号。
我这里是用了add(), sub(), mul(), truediv()用字符串做字典来处理的
这里的运算规则是如果遇到运算符号,那么用这个运算符号计算前面两个数字,再放回去看。
做一个栈,遍历数组,
如果是数字的话就入栈,这里注意str.isdigit()并不认负数,注意处理。
是运算符号的话就去字典找对应的操作,然后pop掉前面两位的数字,拿来进行计算,最后再放回栈中继续参与接下去的计算。

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        d = {}
        d['+'] = add
        d['-'] = sub 
        d['*'] = mul 
        d['/'] = truediv

        stack = []
        for i in tokens:
            if i.isdigit():
                stack.append(i)
            elif i[0]=='-' and i[1:].isdigit():
                stack.append(i)
            if i in d:
                a = stack.pop()
                b = stack.pop()
                stack.append(d[i](int(b),int(a)))
            
        return int(stack[0])

这里注意eval()也可以用来执行一个字符串表达式
eval(f'{second_num} {item} {first_num}')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值