[LeetCode] 1111、有效括号的嵌套深度

题目描述

有效括号字符串类型与对应的嵌套深度计算方法如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c4fYY5Bf-1585896899092)(./imgs/20200402183743.jpg)]
给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,AB,并使这两个字符串的深度最小。

  • 不相交:每个 seq[i] 只能分给 AB 二者中的一个,不能既属于 A 也属于 B
  • AB 中的元素在原字符串中可以不连续
  • A.length + B.length = seq.length
  • 深度最小:max(depth(A), depth(B)) 的可能取值最小。

如果存在多个满足要求的答案,只需返回其中任意 一个 即可。

输入:seq = "()(())()"    // 0表示分割A,1表示分给B
输出:[0,0,0,1,1,0,1,1]
解释:本示例答案不唯一。

解题思路

本题其实相当于让 A 字符串和 B 字符串的 depth 尽可能的接近。为什么呢?因为 seq 对应的栈上,每个左括号都对应一个深度,而这个左括号,要么是 A 的,要么是 B 的。所以,栈上的左括号只要按奇偶分配AB 就可以啦!

更好理解的思路:啥奇偶规律啊?我咋就没看出来有这规律呢?别慌,我帮你捋捋更简单实惠的理解方法。

这题是这样的,要让AB的最大深度最小,关键就是,A\B你俩的深度谁都别涨太快。别A的深度都到10了,B0深度呢。所以很简单,涨深度的时候,谁比较浅,我就给谁涨。降的时候,谁比较深,我就给谁降。

啥叫“涨深度”呢?那就是'('啊,来一个左括号,那深度就涨一格,所以A/B谁浅就给谁涨。深度一样的话呢,就随便给涨一个。涨完了你得降啊,啥叫“降深度”呢?那就是右括号啊,右括号来了谁深先降谁。

我的实现

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int length = seq.size();
        vector<int> ans(length, 0);
        int a = 0, b = 0;
        for(int i = 0; i < length; i++){
            char c = seq[i];
            if(c == '('){
                if(a < b){
                    a++;
                    ans[i] = 0;
                }else{
                    b++;
                    ans[i] = 1;
                }
            }else if(c == ')'){
                if(a > b){
                    a--;
                    ans[i] = 0;
                }else{
                    b--;
                    ans[i] = 1;
                }
            }
        }
        
        return ans;
    }
    
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值