题目
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB
(A
与B
连接), 其中A
和B
都是有效字符串,或者 - 它可以被写作
(A)
,其中A
是有效字符串。
给定一个括号字符串 s
,移动N次,你就可以在字符串的任何位置插入一个括号。
- 例如,如果
s = "()))"
,你可以插入一个开始括号为"(()))"
或结束括号为"())))"
。
返回 为使结果字符串 s
有效而必须添加的最少括号数。
示例 1:
输入:s = "())"
输出:1
示例 2:
输入:s = "((("
输出:3
提示:
1 <= s.length <= 1000
s
只包含'('
和')'
字符。
题解1
思路
- 使用栈模拟括号的闭合情况
代码
from collections import deque
class Solution:
def minAddToMakeValid(self, s: str) -> int:
stack = deque()
ret = 0
for c in s:
if c == "(":
stack.append("(")
elif c == ")" and stack and stack[-1] != "(":
ret += 1
stack.pop()
elif c == ")" and stack and stack[-1] == "(":
stack.pop()
elif c == ")" and not stack:
ret += 1
return ret + len(stack)
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
题解2
思路
- 若序列不是有效序列,可以直接在无效左括号右侧添加右括号闭合
- 所以可以直接通过统计左右括号的数量判断
- 若一个右括号左侧有左括号则直接匹配,若无则对应添加
- 剩余的左括号数量应加入结果集
代码
class Solution:
def minAddToMakeValid(self, s: str) -> int:
left = 0
ret = 0
for c in s:
if c == "(":
left += 1
elif c == ")" and left > 0:
left -= 1
else:
ret += 1
return ret + left
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)