代码随想录27期|Python|Day11|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值

 20. 有效的括号 - 力扣(LeetCode)

本题一个比较好的思路是遇到左括号入栈右括号,然后遍历到右括号的时候弹出右括号即可。(图:代码随想录)

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append('}')
            elif not stack or stack[-1] != item:  # 如果栈在遍历完之前就结束了或者遍历到的右括号在栈里没有保存
                return False
            else:
                stack.pop()
        # 正确返回条件:栈是空的且for循环没有提前终止
        return True if not stack else False

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode) 

思路

需要单独开一个存储空间,来一边接收新遍历到的字符,一边和之前的比较,相同的连同之前的一起弹出有点像消消乐)。(图:代码随想录)

栈实现

class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        res = list()
        # 使用列表的好处是可以不用reverse
        for item in s:
            if res and res[-1] == item:  # 如果当前的res不是空的而且前面一个恰好是重复的字符
                res.pop()
            else:
                res.append(item)
        return ''.join(res)

双指针实现

class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        res = list(s)
        fast, slow = 0, 0
        while fast < len(s):
            # 先把fast遍历到的传递给slow
            res[slow] = res[fast]
            # 比较slow接收到的和前一个是否一致
            if slow > 0 and res[slow] == res[slow - 1]:
                slow -= 1
            else:
                slow += 1  # 更新slow
            fast += 1  # 更新fast
        return ''.join(res[:slow])

 150. 逆波兰表达式求值 - 力扣(LeetCode)

from operator import add, sub, mul

class Solution(object):
    op_map = {
        "+": add, 
        "-": sub, 
        "*": mul, 
        "/": lambda x, y: int(x / y), }
    
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        res = []
        for token in tokens:
            if token not in self.op_map:
                res.append(int(token))
            else:
                op2 = res.pop()  # 注意!!先弹出的是后一个运算的数字
                op1 = res.pop()
                res.append(self.op_map[token](op1, op2))
        return res.pop()

第11天完结🎉

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值