1111.有效括号的嵌套深度

有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。

嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。

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

给你一个「有效括号字符串」seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。

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

划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下:

  • answer[i] = 0,seq[i] 分给 A 。
  • answer[i] = 1,seq[i] 分给 B 。
    如果存在多个满足要求的答案,只需返回其中任意一个即可。

思路:
在括号字符串有效条件下,最大嵌套深度实际上等于'('连续出现的最大次数。假设嵌套深度最大部分的深度为d,
则划分以后max(depth(A),depth(B))最小一定等于ceil(d/2)。如果有效字符串seq是几个有效字符串的连接,那么
只用考虑嵌套深度最大的部分,因为其它部分一定可以划分为深度都小于ceil(d/2)的两部分。如果部分闭合的有效字
符串深度不超过ceil(d/2),那么加入到A还是B都不会影响结果。

做法:
1.遍历seq,计算出整个字符串的最大深度。
2.遍历seq。

  • 遇到'(',当A深度小于ceil(max_depth/2)时,加入A;反之加入B。
  • 遇到')',当A中还有未闭合的'('时加入A;反之加入B。
    vector<int> maxDepthAfterSplit(string seq) {
        vector<int> res(seq.size());
        if(seq.size()==0) return res;
        //计算出max_len
        int len=0,max_len=0;
        for(int i=0;i<seq.size();++i){
            if(seq[i]=='('){
                len++;
                if(len>max_len) max_len=len;
            }
            else len--;
        }
        //已知max(depth(A),depth(B))=ceil(max_len/2),得出A
        int a_depth=0;
        int mid=(max_len+1)/2;
        for(int i=0;i<seq.size();++i){
            if(seq[i]=='('){
                if(a_depth<mid) {
                    a_depth++;
                    res[i]=0;
                }
                else{
                    res[i]=1;
                }
            }
            else{
                if(a_depth>0){
                    a_depth--;
                    res[i]=0;
                }
                else{
                    res[i]=1;
                }
            }
        }
        return res;
    }
posted @ 2020-07-26 20:15  归鸿唱晚  阅读(161)  评论(0编辑  收藏  举报