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

本文介绍了使用Python解决三道算法题的方法,包括检查字符串是否为有效括号,删除字符串中的所有相邻重复项,以及求解逆波兰表达式的值。解决方案主要利用了栈的数据结构,对于括号问题,通过匹配括号类型来判断有效性;对于删除重复项,利用栈来去除相邻重复字符;对于逆波兰表达式,将运算符转换为对应函数并进行计算。
摘要由CSDN通过智能技术生成

代码随想录算法训练营第十一天|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}')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>