返回

LeetCode 1249. Minimum Remove to Make Valid Parentheses:Python 精彩解读

后端

算法概览

LeetCode 1249 题要求您找出移除最少数量的括号,以使给定字符串中的所有括号都匹配有效。为此,我们需要借助栈这一数据结构。栈遵循后进先出的原则,恰好可以用来处理括号匹配的问题。

我们从字符串的左到右扫描,遇到左括号时将它压入栈中,遇到右括号时,如果栈顶元素是左括号,则将它们匹配并弹出栈顶元素。如果栈顶元素不是左括号,则将该右括号视为不匹配,将其添加到需要移除的括号列表中。

扫描结束后,栈中可能还残留一些未匹配的左括号。这些左括号也需要添加到需要移除的括号列表中。

Python 实现

def minRemoveToMakeValid(s):
    """
    :type s: str
    :rtype: str
    """
    # 使用栈来存储左括号的下标
    stack = []
    # 需要移除的括号的下标
    remove = set()

    # 从左到右扫描字符串
    for i, c in enumerate(s):
        if c == '(':
            # 将左括号的下标压入栈中
            stack.append(i)
        elif c == ')':
            # 如果栈顶元素是左括号,则将它们匹配并弹出栈顶元素
            if stack:
                stack.pop()
            # 否则,将该右括号视为不匹配
            else:
                remove.add(i)

    # 将栈中残留的左括号的下标添加到需要移除的括号列表中
    remove |= set(stack)

    # 构造新的字符串
    result = []
    for i, c in enumerate(s):
        if i not in remove:
            result.append(c)

    return ''.join(result)

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。我们只需要从左到右扫描字符串一次,因此时间复杂度为 O(n)。
  • 空间复杂度:O(n),在最坏的情况下,栈中可能存储所有左括号的下标,因此空间复杂度为 O(n)。

结语

LeetCode 1249 题是一道经典的“括号”类题目,考察的就是栈的使用。这道题还结合了字母和括号的复杂情况,基本思路不变,具体还要结合题意进行分析。如果您对这道题还有任何疑问,欢迎在评论区留言。