zoukankan      html  css  js  c++  java
  • 【栈】1111. 有效括号的嵌套深度

    在这里插入图片描述
    在这里插入图片描述

    思路:维护一个栈 s,从左至右遍历括号字符串中的每一个字符:

    如果当前字符是 (,就把 ( 压入栈中,此时这个 ( 的嵌套深度为栈的高度;

    如果当前字符是 ),此时这个 ) 的嵌套深度为栈的高度,随后再从栈中弹出一个 (

    下面给出了括号序列 (()(())()) 在每一个字符处的嵌套深度:

    括号序列   ( ( ) ( ( ) ) ( ) )
    下标编号   0 1 2 3 4 5 6 7 8 9
    嵌套深度   1 2 2 2 3 3 2 2 2 1 
    

    知道如何计算嵌套深度,问题就很简单了:只要在遍历过程中,我们保证栈内一半的括号属于序列 A,一半的括号属于序列 B,那么就能保证拆分后最大的嵌套深度最小,是当前最大嵌套深度的一半。要实现这样的对半分配,我们只需要把奇数层的 ( 分配给 A,偶数层的 ( 分配给 B 即可。对于上面的例子,我们将嵌套深度为 1 和 3 的所有括号 (()) 分配给 A,嵌套深度为 2 的所有括号 ()()() 分配给 B。

    class Solution {
        public int[] maxDepthAfterSplit(String seq) {
            char[] chs = seq.toCharArray();
            int n = 0;
            int[] ans = new int[chs.length];
            for (int i = 0; i < chs.length; i++) {
                if (chs[i] == '(') {
                    n++;
                    if (n % 2 != 0)
                        ans[i] = 1;
                    else
                        ans[i] = 0;
                } else if (chs[i] == ')') {
                    if (n % 2 != 0)
                        ans[i] = 1;
                    else
                        ans[i] = 0;
                    n--;
                }
    
            }
            return ans;
        }
    
        public static void main(String[] args) {
            new Solution().maxDepthAfterSplit("(()())");
        }
    }
    
  • 相关阅读:
    VB.NET中获取串口列表
    跟着你混,真吃亏!
    [翻译]部署Microsoft .NET Framework Version 3.0(含下载)
    将特定格式的TXT数据文件写入EXCEL
    VB.NET中判断一个数组中是否有重值
    多语言应用程序开发
    .NET 环境下进制间的转换
    初识.NET
    映射Y轴
    Culture Name
  • 原文地址:https://www.cnblogs.com/HoweZhan/p/12611810.html
Copyright © 2011-2022 走看看