「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」
[最小栈]
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) —— 将元素 x 推入栈中。
- pop() —— 删除栈顶的元素。
- top() —— 获取栈顶元素。
- 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.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
解题思路:
- 常规方法,将栈看成一个列表,然后对列表进行增删改查操作即可
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.minStack = [float('inf')]
def push(self, x: int) -> None:
self.stack.append(x)
self.minStack.append(min(x,self.minStack[-1]))
def pop(self) -> None:
self.stack.pop()
self.minStack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.minStack[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
执行结果:
[移除无效的括号]
给你一个由 '('、')' 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以下 任意一条 要求:
空字符串或只包含小写字母的字符串 可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
示例 1:
输入:s = "lee(t(c)o)de)" 输出:"lee(t(c)o)de" 解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。 示例 2:
输入:s = "a)b(c)d" 输出:"ab(c)d" 示例 3:
输入:s = "))((" 输出:"" 解释:空字符串也是有效的 示例 4:
输入:s = "(a(b(c)d)" 输出:"a(b(c)d)"
提示:
1 <= s.length <= 10^5 s[i] 可能是 '('、')' 或英文小写字母
解题思路:
- 要移除无效的括号,就需要确定出现的括号是否有效,
- 左括号暂时不能确定是否有效,可以将其位置信息缓存起来,
- 对于出现的右括号,缓存的有之前出现的尚未进行匹配的左括号,则说明其有效。
- 根据记录的位置移除那些无效的括号,即可得到结果。
class Solution:
def minRemoveToMakeValid(self, s: str) -> str:
arr = []
stack = []
for i in range(len(s)):
if s[i] == '(':
stack.append(i)
elif s[i] == ')':
if stack:
stack.pop()
else:
arr.append(i)
arr += stack
lst = list(s)
for i in arr:
lst[i] = ''
return ''.join(lst)
执行结果: