zoukankan      html  css  js  c++  java
  • [leetCode]1111. 有效括号的嵌套深度

    在这里插入图片描述

    均分最大深度

    • 遍历seq计算最大深度maxDepth
    • 遍历seq,遇到"(",当A子序列的最大深度小于ceil(maxDepth/2)时分配给A,反之分配给B
    • 遇到")", 当A的最大深度不为0时说明A子序列还有未被匹配的"(",所以分配给A,否则分配给B
    class Solution {
        public int[] maxDepthAfterSplit(String seq) {
            List<Integer> ans = new ArrayList<>();
            if (seq.length() == 0) return new int[]{};
            // 记录当前深度
            int depth = 0;
            // 记录最大深度
            int maxDepth = 0;
            for (int i = 0; i < seq.length(); i++) {
                if (seq.charAt(i) == '(') {
                    depth++;
                    if (depth > maxDepth)
                        maxDepth = depth;
                } else {
                    depth--;
                }
            }
            int aDepth = 0;
            // 最大深度二分之一的上界
            int mid = 1 + ((maxDepth - 1) / 2);
            for (int i = 0; i < seq.length(); i++) {
                if (seq.charAt(i) == '(') {
                    if (aDepth < mid) {
                        ans.add(0);
                        aDepth++;
                    }else {
                        ans.add(1);
                    }
                } else {
                    // A中还有未被配对的左括号
                    if (aDepth > 0) {
                        ans.add(0);
                        aDepth--;
                    } else {
                        ans.add(1);
                    }
                }
            }
            int[] res = new int[ans.size()];
            for (int i = 0; i < res.length; i++) {
                res[i] = ans.get(i);
            }
            return res;
        }
    }
    

    均分当前深度

    如果A子序列的深度小于当前深度的一半,那么也肯定小于最大深度的一半

    class Solution {
        public int[] maxDepthAfterSplit(String seq) {
            if (seq.length() == 0) return new int[]{};
            int[] ans = new int[seq.length()];
            // 记录当前深度
            int depth = 0;
            int aDepth = 0;
            for (int i = 0; i < seq.length(); i++) {
                if (seq.charAt(i) == '(') {
                    depth++;
                    // 计算当前深度的一半
                    int mid = 1 + ((depth - 1) / 2);
                    if (aDepth < mid) {
                        ans[i] = 0;
                        aDepth++;
                    } else {
                        ans[i] = 1;
                    }
                } else {
                    depth--;
                    if (aDepth > 0) {
                        ans[i] = 0;
                        aDepth--;
                    } else {
                        ans[i] = 1;
                    }
                }
            }
            return ans;
        }
    }
    

    奇偶性

    通过奇偶性将深度为奇数的括号与深度为偶数的括号平分

    class Solution {
        public int[] maxDepthAfterSplit(String seq) {
            if (seq.length() == 0) return new int[]{};
            int[] ans = new int[seq.length()];
            // 记录当前深度
            int depth = 0;
            for (int i = 0; i < seq.length(); i++) {
                if (seq.charAt(i) == '(') {
                    ans[i] = ++depth % 2;
                } else {
                    ans[i] = depth-- % 2;
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    DHCP全局配置文件解析
    DHCP介绍
    使用Samba服务程序,让linux系统之间共享文件
    操作系统
    XML基础、 webservice
    JDBC编程--JDBC进阶
    JDBC编程--JDBC基础
    JDBC编程--SQL基础
    Java web--web编程原理
    Java web--web编程进阶(二)
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859909.html
Copyright © 2011-2022 走看看