leetcode【每日一题】有效括号的嵌套深度Java

题干

有效括号字符串 仅由 “(” 和 “)” 构成,并符合下述几个条件之一:

空字符串
连接,可以记作 AB(A 与 B 连接),其中 A 和 B 都是有效括号字符串
嵌套,可以记作 (A),其中 A 是有效括号字符串
类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度 depth(S):

s 为空时,depth("") = 0
s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是有效括号字符串
s 为嵌套情况,depth("(" + A + “)”) = 1 + depth(A),其中 A 是有效括号字符串
例如:"","()()",和 “()(()())” 都是有效括号字符串,嵌套深度分别为 0,1,2,而 “)(” 和 “(()” 都不是有效括号字符串。

给你一个有效括号字符串 seq,将其分成两个不相交的子序列 A 和 B,且 A 和 B 满足有效括号字符串的定义(注意:A.length + B.length = seq.length)。

现在,你需要从中选出 任意 一组有效括号字符串 A 和 B,使 max(depth(A), depth(B)) 的可能取值最小。

返回长度为 seq.length 答案数组 answer ,选择 A 还是 B 的编码规则是:如果 seq[i] 是 A 的一部分,那么 answer[i] = 0。否则,answer[i] = 1。即便有多个满足要求的答案存在,你也只需返回 一个。

示例 1:

输入:seq = "(()())"
输出:[0,1,1,1,1,0]

示例 2:

输入:seq = "()(())()"
输出:[0,0,0,1,1,0,1,1]

提示:

1 <= text.size <= 10000

想法

题干又是leetcode「教科书般」超多字但是读不懂题的题干

用人话说就是:
每个有效字符串的’(‘都要有’)'与它对应
当然这道题给定的就是有效的
然后看例子
比如

输入:seq = "(()())"
输出:[0,1,1,1,1,0]

相当于数组为0的位置对应部分a
反之部分b
然后再看

现在,你需要从中选出 任意 一组有效括号字符串 A 和 B,使 max(depth(A), depth(B)) 的可能取值最小。

显然两个相等的时候(因为seq的长度一定是偶数
max(depth(A), depth(B))最小,所以奇偶排布即可

Java代码

package daily;

import java.util.Arrays;

public class MaxDepthAfterSplit {
    public int[] maxDepthAfterSplit(String seq) {
        //存储答案的数组
        int [] res=new int[seq.length()];
        //遍历的位置
        int index=0;
        for (char c:seq.toCharArray()
             ) {
            //'('的话 偶数放0 奇数放1 
            if(c=='('){
                if(index%2==0){
                    res[index]=0;
                }
                else {
                    res[index]=1;
                }
            }
            //')'反之

            else{
                if(index%2==0){
                    res[index]=1;
                }
                else {
                    res[index]=0;
                }

            }
            index++;

        }
        return  res;

    }
    public static  void main(String[] args){
       MaxDepthAfterSplit maxDepthAfterSplit=new MaxDepthAfterSplit();
        String seq = "(()())";
        System.out.println(Arrays.toString(maxDepthAfterSplit.maxDepthAfterSplit(seq)));
    }
}

通过位运算更简洁写法

此代码参考

public class Solution {
    public int[] maxDepthAfterSplit(String seq) {
        int[] ans = new int [seq.length()];
        int idx = 0;
        for(char c: seq.toCharArray()) {
            ans[idx++] = c == '(' ? idx & 1 : ((idx + 1) & 1);
        }
        return ans;
    }
}

我的leetcode代码都已经上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3775

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/105240513