【Leetcode】1541. Minimum Insertions to Balance a Parentheses String

题目地址:

https://leetcode.com/problems/minimum-insertions-to-balance-a-parentheses-string/

给定一个长 n n n的括号字符串 s s s,定义其为“平衡”当且仅当每个'('都可以找到其右的某个'))'配对(即把正常的括号平衡的定义中右括号的配对个数改为 2 2 2)。问至少添加多少个括号就可以使其平衡。

可以使用栈。栈内只存未被匹配好的左括号。当遇到左括号的时候直接入栈;当遇到右括号的时候,首先看一下其后是否紧跟着另一个右括号,如果是,则看一下栈空不空,由于我们让栈里只存左括号,所以如果栈空的话,那么说明有个左括号可以与后面的两个右括号匹配,则pop栈顶;如果栈空,则说明需要补 1 1 1个左括号;如果其后没有紧跟着另一个右括号(或者后面没括号了,或者后面跟着的是左括号),那么也看一下栈是否空,如果栈空,则说明该右括号需要一个左括号一个右括号来保持平衡,所以答案加 2 2 2,如果栈不空,则只需要一个右括号去平衡即可,答案加 1 1 1同时pop栈顶。最后遍历完之后,栈内存的全是左括号,它们需要两倍栈size的右括号去平衡,将两倍栈size加入答案。代码如下:

import java.util.ArrayDeque;
import java.util.Deque;

public class Solution {
    public int minInsertions(String s) {
        Deque<Character> stk = new ArrayDeque<>();
        int res = 0;
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                stk.push(ch);
            } else {
                if (i < s.length() - 1 && s.charAt(i + 1) == ')') {
                    if (stk.isEmpty()) {
                        res++;
                    } else {
                        stk.pop();
                    }
                    
                    i++;
                } else {
                    if (stk.isEmpty()) {
                        res += 2;
                    } else {
                        stk.pop();
                        res++;
                    }
                }
            }
        }
        
        return res + stk.size() * 2;
    }
}

时空复杂度 O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值