只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB
(A
与B
连接), 其中A
和B
都是有效字符串,或者 - 它可以被写作
(A)
,其中A
是有效字符串。
给定一个括号字符串 s
,在每一次操作中,你都可以在字符串的任何位置插入一个括号
- 例如,如果
s = "()))"
,你可以插入一个开始括号为"(()))"
或结束括号为"())))"
。
返回 为使结果字符串 s
有效而必须添加的最少括号数。
示例 1:
输入:s = "())" 输出:1
示例 2:
输入:s = "(((" 输出:3
提示:
1 <= s.length <= 1000
s
只包含'('
和')'
字符。
解法1:栈
Java版:
class Solution {
public int minAddToMakeValid(String s) {
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ')' && !stack.isEmpty() && stack.peek() == '(') {
stack.pop();
} else {
stack.push(c);
}
}
return stack.size();
}
}
Python3版:
class Solution:
def minAddToMakeValid(self, s: str) -> int:
stack = []
for c in s:
if c == ')' and stack and stack[-1] == '(':
stack.pop()
else:
stack.append(c)
return len(stack)
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。
- 空间复杂度:O(n)。
另一种写法:
Java版:
class Solution {
public int minAddToMakeValid(String s) {
StringBuilder st = new StringBuilder(s);
int i = 0;
while (i < st.length()) {
char c = st.charAt(i);
if (i > 0 && c == ')' && st.charAt(i - 1) == '(') {
st.delete(i - 1, i + 1);
i -= 2;
}
i++;
}
return st.length();
}
}
Python3版:
class Solution:
def minAddToMakeValid(self, s: str) -> int:
i = 0
while i < len(s):
if i > 0 and s[i] == ')' and s[i - 1] == '(':
s = s[:i - 1] + s[i + 1:]
i = i - 2
i += 1
return len(s)
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串 s 的长度。
- 空间复杂度:O(n) 或 O(1),取决于是否原地修改字符串 s 。