每日一题,每日一练,17有效括号的嵌套深度(你以为右括号是第一层,实际上是第二层,而栈在第五层)

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

空字符串
连接,可以记作 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]

这题,呵,我读了一小时题才看明白==
翻译一下:
有A和B两个列表存在,我们要把每组有效括号放在相应的列表,在这个字符串中,如果把这个括号放进A,则标0,否则标1,(你反过来也是一样的),对于该题的需求如下:每个括号对具有它的嵌套深度,即它是第几层的括号如“((()))”嵌套深度为123321,“(())()”为122111,我们需要让A里的最大深度和B里面的最大深度中两个值中的最大值尽可能小(注意:这里重新生成的A和b合成字符串输出后所有括号的嵌套深度要重新计算)。返回对每个括号位置的存放结果。

那么这样题目变得简单了许多,我们假想一个栈来存储括号,左括号为压栈,右括号为出栈(栈是在各种括号匹配题是用的最多的数据结构),之后运用平均的思想,如果四个盒子嵌套分成两组,那么肯定是平均两个盒子能达到我们的需求,因此,我们遍历字符串,如果是左括号,我们就压栈,然后扔到左面里面,并将下一层的左括号准备扔进另一边,如果是右括号,我们就扔到这一层的深度和当层左括号结合,然后退栈,准备扔到另一边,可以看出每当深度发生变化时,我们要扔括号的位置也就发生了变化,因此我们用深度mod 2 来表示我们要扔到哪边,将深度平均分开,而对于栈整体,我们只用到了深度,所以我们只用一个指针q来记录深度就行了,不用实际创建一个栈

class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        if(seq==" "):
            return 0
        q=-1#意味着栈什么都没有,本题也可以用0来表示深度为0,不过是先扔到哪的区别
        end=[]
        for i in seq:
            if(i=="("):
                q=q+1
                end.append(q%2)
            elif(i==")"):
                end.append(q%2)
                q=q-1
        return end

这钵啊,这钵是因为你不会,所以你才会,这句话是个哲学

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章