力扣1111.有效括号的嵌套深度

解题思路

image.png

题目链接
https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/
这道题其实实现起来并不难,关键是要理解题意。其实我也理解了题意,但是没有想到合适的方法。
首先,将题目总结下:
1.字符串一定是有效的,意味着字符串是成双成对的(这个我想到了)
2.需要分成不相交的有效括号字符。这个不相交我迷惑了一下,开始是以为只能是如[0,0,1,1,1,1]这样的,就是说A在一边,B在另外一边,但是看例子显然不是这样。
3.要求字符串的深度最小。

第3个要求我开始根本没考虑,我考虑的是这道题的考点。要求分为A,B两个有效括号,那么就应该是一个入栈出栈的问题,保证配对就可以了。
因此,本题的难点是如何将配对和深度同时考虑。

深度最小的含义是什么?观察深度的定义方法,是嵌套的层数。也即是需要将嵌套的层数变的最小。然后看输出知道A和B可以离散地分布在任何地方(保证有效性即可),如果让A和B的层数一直保持着较低的层数,那么最好的方式就是两个深度几乎保持一致,因为深度总是那么深,如果AB深度接近,总体深度就比较低了。

那么可以有这样的思路

对应的代码如下:

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int deepa=1;
        int deepb=0;
        vector<int> vec(seq.size(),1);
        for(int i=1;i<seq.size();i++)
        {
            if(seq[i]=='(')
            {
                if(deepa>deepb){vec[i]=0;deepb++;}
                else{deepa++;}
            }else
            {
                if(deepa<deepb){vec[i]=0;deepb--;}
                else{deepa--;}
            }
        }
    return vec;}
};

这也是最原始的思路的实现。这样的代码和清晰,但是这里定义了两个深度的变量。于是,思考一下可不可以只用一个深度来解决这个问题。题中说了答案并不唯一,即我们所求答案是所有答案的一个子集。我们可以这样规定,只要是奇数的加深度的动作,都置为A,只要是奇数的减去深度的动作我们都置为B;只要是偶数的加深度的动作,都置为B,只要是偶数的减去深度的动作都置为A。
在这样的思路下,可以写出最终的解。
再次强调,我们的答案是所有答案的一个子集。

最终代码

class Solution {
public:
    vector<int> maxDepthAfterSplit(string seq) {
        int deep=0;
        vector<int> vec;
        for(auto ch:seq)
        {
            if(ch=='(')
            {deep++;
                if(deep%2)vec.push_back(1);
                else
                vec.push_back(0);
            }
            else{
                deep--;
                if(deep%2)vec.push_back(0);
                else vec.push_back(1);
            }
        }
    return vec;}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值