📅  最后修改于: 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)$