力扣:使括号有效的最少添加

题目分析


给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 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 说明有需要补充的左括号
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值