2022跟着leedcode学数据结构--第17天

124 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

image.png

[最小栈]

设计一个支持 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()

执行结果:

image.png

[移除无效的括号]

给你一个由 '('、')' 和小写字母组成的字符串 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)

执行结果:

image.png