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.
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] 的输入。