LeetCode每日一题(四)

1111.有效括号的嵌套深度

题目:

有效括号字符串:

仅由 () 构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:

1. 空字符串
2. 连接,可以记作AB,其中 A 和 B 都是有效括号字符串
3. 嵌套,可以记作(A),其中 A 是有效括号字符串
嵌套深度:

类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度 depth(s)

1. s 为空时,depth("") = 0
2. s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是有效括号字符串
3. s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串
问题:

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

不相交:每个 seq[i] 只能分给 AB 二者中的一个,不能既属于 A 也属于 B
注:AB 中的元素在原字符串中可以不连续。
A.length + B.length = seq.length
深度最小:max(depth(A), depth(B)) 的可能取值最小。
划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下:

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

思路:

由深度的定义可知,应尽可能将成对的括号均分给AB以确保深度最小。

显然,左括号对应嵌套深度+1,右括号对应嵌套深度-1。因此,只需要把成对的括号按嵌套深度的奇偶性拆分为两组即可。代码如下:

class Solution {
    public int[] maxDepthAfterSplit(String seq) {
        int[] result = new int[seq.length()];
        int depth = 0;
        
        // 将奇数深度分给A,偶数深度分给B
        for (int i=0; i < seq.length(); i++) {
            if (seq.charAt(i) == '(') {
                depth++;
                result[i] = (depth+1) % 2;
            }else {
                depth--;
                // 右括号使深度减小,需要对其划分逻辑取反
                result[i] = depth % 2;
            }
        }
        
        return result;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/aries99c/p/12616941.html