📌  相关文章
📜  长度为N的任何括号序列的最小和(1)

📅  最后修改于: 2023-12-03 15:12:34.865000             🧑  作者: Mango

长度为N的任何括号序列的最小和

问题描述

给定一个长度为N的括号序列,其中包含左括号'('和右括号')'。现在希望通过添加一些左括号或右括号,使得这个括号序列合法。合法的定义是,对于任意一个位置i,它左边的括号中左括号的数量要大于或等于右括号的数量。

现在请问,最少需要添加多少个括号,才能使得这个括号序列合法?

解法

这是一个典型的栈的应用。我们可以使用一个栈来模拟括号匹配的过程。

遍历字符串中的每一个字符,当遇到左括号时,将它压入栈中;当遇到右括号时,首先判断栈是否为空。如果栈为空,说明当前右括号没有匹配的左括号,需要添加一个左括号;否则从栈中弹出一个左括号,匹配当前的右括号。遍历完成后,如果栈中还有剩余的左括号,需要添加对应的右括号。

最终,需要添加的最少括号数目是左括号的个数加上右括号的个数。

def min_needed_parentheses(s: str) -> int:
    stack = []
    left_parentheses = right_parentheses = 0
    for c in s:
        if c == '(':
            stack.append(c)
            left_parentheses += 1
        elif c == ')':
            if not stack:
                right_parentheses += 1
            else:
                stack.pop()
    return left_parentheses + right_parentheses + len(stack)
时间复杂度和空间复杂度

时间复杂度:$O(N)$

空间复杂度:$O(N)$

测试
assert min_needed_parentheses("()") == 0
assert min_needed_parentheses("())") == 1
assert min_needed_parentheses("(()") == 1
assert min_needed_parentheses("(((())))") == 0
assert min_needed_parentheses("))((") == 4