题目链接:https://leetcode.cn/problems/minimum-add-to-make-parentheses-valid/
题目描述:
只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成
AB
(A
与B
连接), 其中A
和B
都是有效字符串,或者 - 它可以被写作
(A)
,其中A
是有效字符串。
给定一个括号字符串 s
,移动N次,你就可以在字符串的任何位置插入一个括号。
- 例如,如果
s = "()))"
,你可以插入一个开始括号为"(()))"
或结束括号为"())))"
。
返回 为使结果字符串 s
有效而必须添加的最少括号数。
示例 1:
输入:s = "())"
输出:1
示例 2:
输入:s = "((("
输出:3
提示:
1 <= s.length <= 1000
s
只包含'('
和')'
字符。
解法:堆栈
我们可以使用一个int类型的变量temp来模拟堆栈,用来记录字符串中为被消除的左括号’(',用result来表示最终需要添加的括号数。
遍历字符串,当字符为’(‘时,temp++;当字符为’)'时,分为下面两种情况:
- 当
temp > 0
时,表示前面字符串中存在未被消除的左括号,则temp--
,消除一个左括号。 - 当
temp = 0
时,表示前面已经没有左括号了,则需要在这个字符前面加一个左括号,即result++
。
遍历完字符串时,若 temp > 0,表示还存在未被消除的左括号,所有需要添加temp个右括号进行消除,即 result += temp
。
代码:
class Solution {
public int minAddToMakeValid(String s) {
int temp = 0;
int result = 0;
char[] sChars = s.toCharArray();
for (int i = 0; i < sChars.length; i++) {
if(sChars[i] == '(') {
temp++;
} else {
if(temp > 0) {
temp--;
} else {
result++;
}
}
}
return result + temp;
}
}