📜  使表达式平衡所需的最小括号反转次数(1)

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

使表达式平衡所需的最小括号反转次数

在编程中,经常会遇到需要判断一个表达式中的括号是否匹配,如果不匹配需要进行调整,以保证表达式的正确性。现在问题就转化为如何最小次数的进行括号反转操作,才能使得表达式平衡。

方法一:栈

利用栈的特性可以轻松实现括号匹配。我们遍历表达式中的每个字符,如果遇到一个左括号就将其压入栈中,如果遇到一个右括号则弹出栈顶元素与其匹配,如果不匹配就需要进行括号反转操作。最后统计未匹配的左括号和未匹配的右括号,分别求出需要反转的次数,求和即可。

代码:

def reverse_parentheses(s: str) -> int:
    left, right = [], []    # 记录未匹配的左括号和右括号
    for c in s:
        if c == '(':
            left.append(c)
        elif c == ')':
            if left:     # 左括号有匹配项
                left.pop()
            else:
                right.append(c)
    return (len(left) + len(right)) // 2

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

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

方法二:贪心

上述方法的时间和空间复杂度都还不错,不过我们发现其实只需统计连续的左括号和右括号不匹配的情况,因为这样的情况下我们只需要翻转其中一个符号即可将其匹配。可以定义两个变量$left$和$right$分别表示未匹配的左右括号数量,遍历表达式中的每个字符,如果遇到一个左括号就将$left$加一,如果遇到一个右括号就将$right$加一,如果$right>left$则需要进行反转,此时将$left$加一,$right$减一,表示反转了一个右括号成为一个左括号。

代码:

def reverse_parentheses(s: str) -> int:
    left, right = 0, 0   # 记录未匹配的左括号和右括号
    res = 0              # 记录需要反转的次数
    for c in s:
        if c == '(':
            left += 1
        elif c == ')':
            right += 1
            if right > left:  # 需要进行反转
                left += 1
                right -= 1
                res += 1
    res += (right - left) // 2   # 统计剩余未匹配的括号
    return res

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

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