题目分析
给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括号字符串有效。
从形式上讲,只有满足下面几点之一,括号字符串才是有效的:
- 它是一个空字符串,或者
- 它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者
- 它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。
力扣:921.使括号有效的最少添加
示例1:
:输入:"(()("
输出:2
示例2:
输入:"()))(("
输出:4
题目分析
和括号匹配一样,可以采用 栈 Stack 来实现,做完后通过学习题解,了解了大佬们的解题思路如下:
保证左右括号数量的 平衡: 计算 ‘(’ 出现的次数减去 ‘)’ 出现的次数。如果值为 0,那就是平衡的,如果小于 0,就要在前面补上缺少的 ‘(’。
计算 S 每个前缀子数组的 平衡度。如果值是负数(比如说,-1),那就得在前面加上一个 ‘(’。同样的,如果值是正数(比如说,+B),那就得在末尾处加上 B 个 ‘)’ 。
AC代码:
1、使用栈解答
class Solution {
public int minAddToMakeValid(String S) {
Stack<Character> stack = new Stack<>();
char[] chars = S.toCharArray();
int ans = 0;
for(char ch : chars){
if(ch == '(') {
stack.push(ch);
continue;
}
if(!stack.isEmpty()){
stack.pop();
} else {
ans ++;
}
}
// ans 为需要补充的左括号数量, stack.size() 为需要补充的有括号的数量
return ans + stack.size();
}
}
2、通过变量维持左右括号平衡
class Solution {
public int minAddToMakeValid(String S) {
int ans = 0 , bal = 0;
char[] chars = S.toCharArray();
for(char ch : chars){
bal += ch == '(' ? 1 : -1; // 维持平衡
// 说明缺少左括号, ans 加 1 即补上缺少的左括号 ,补完需将 bal 置为平衡状态
if(bal == -1){
bal ++;
ans ++;
}
}
return ans + bal; // bal > 0 说明需要补的有括号数量,ans > 0 说明有需要补充的左括号
}
}