[Leetcode] [Tutorial] 栈


20. 有效的括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

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

Solution

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        # 创建一个字典来匹配括号
        bracket_map = {
    
    ')': '(', '}': '{', ']': '['}

        # 遍历字符串
        for char in s:
            # 如果字符是闭括号
            if char in bracket_map:
                # 弹出栈顶元素。如果栈为空,则返回一个非法的开括号
                top_element = stack.pop() if stack else '#'

                # 检查栈顶的开括号是否与当前的闭括号匹配
                if bracket_map[char] != top_element:
                    return False
            else:
                # 如果字符是开括号,压入栈中
                stack.append(char)

        # 如果栈为空,那么字符串是有效的
        return not stack

需要注意的是,在检查完一个闭括号与栈顶的开括号是否匹配时,还需要考虑栈可能为空的情况。

155. 最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

扫描二维码关注公众号,回复: 16910505 查看本文章

Solution

要实现这样一个支持获取最小元素的栈,我们可以使用两个栈来实现。

  • 主栈:用来保存所有元素,执行正常的 push 和 pop 操作。
  • 最小值栈:每次新元素入主栈时,将此时主栈的最小值也推入最小值栈;每次从主栈弹出元素时,最小值栈也要弹出元素。

这样,最小值栈的栈顶元素始终是主栈当前的最小元素,可以在常数时间内检索到最小元素。

class MinStack:

    def __init__(self):
        self.stack = []
        self.min_stack = []

    def push(self, val: int) -> None:
        self.stack.append(val)
        if not self.min_stack:
            self.min_stack.append(val)
        else:
            self.min_stack.append(min(val, self.min_stack[-1]))

    def pop(self) -> None:
        self.stack.pop()
        self.min_stack.pop()

    def top(self) -> int:
        return self.stack[-1]

    def getMin(self) -> int:
        return self.min_stack[-1]

394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

猜你喜欢

转载自blog.csdn.net/weixin_45427144/article/details/131659821