• 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;
        }
    
  • 相关阅读:
    [HEOI2015]兔子与樱花
    [HNOI2015]亚瑟王
    [JSOI2011]分特产
    某考试 T3 sine
    [JSOI2015]最小表示
    51NOD 1258 序列求和 V4
    Codeforces 622F The Sum of the k-th Powers
    Loj #6261. 一个人的高三楼
    [HAOI????] 硬币购物
    bzoj4318 OSU!
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/13381804.html
Copyright © 2020-2023  润新知