leetcode1111. 有效括号的嵌套深度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:参考解答区大神甜姨的解答
题目最后 answer 的意思就是,为 0 的部分对应 seq 的括号是 A 字符串,为 1 的部分对应 seq 的括号是 B 字符串。
示例 1:
输入:seq = “(()())”
输出:[0,1,1,1,1,0]
answer 的意思是下面这个样子。红色部分是 A 串,蓝色部分是 B 串。在这里插入图片描述
示例 2:
输入:seq = “()(())()”
输出:[0,0,0,1,1,0,1,1]
对应的 answer 的图示:
在这里插入图片描述
题面也说了 answer 的答案是不唯一的,下面这样也是可以的:
在这里插入图片描述
下面说做法:
我假设你已经做过上面的题目了(有效的括号),知道需要用栈辅助判断。题面中的 depth 其实就是栈的最大深度。“你需要从中选出任意一组有效括号字符串 A 和 B,使 max(depth(A), depth(B)) 的可能取值最小”。这句话其实相当于让 A 字符串和 B 字符串的 depth 尽可能的接近。为什么呢?因为 seq 对应的栈上,每个左括号都对应一个深度,而这个左括号,要么是 A 的,要么是 B 的。所以,栈上的左括号只要按奇偶分配给A和B就可以啦!时间复杂度很明显是 O(n) 的,空间复杂度也是 O(n)(如果算返回的变量的话)。

简言之:遍历字符串,遇到左括号,如果下标位置是偶数,归为0,即A组,下标位置为奇数,归为1,即B组;遇到右括号,则相反(因为一对有效的括号不可能同时出现在奇数位置或偶数位置上)

代码:

class Solution:
    def maxDepthAfterSplit(self, seq: str) -> List[int]:
        ans = [0] * len(seq)
        for i in range(len(seq)):
            if seq[i] == '(':   #遇到左括号
                ans[i] = i & 1  #利用位运算判断奇偶性
            else:               #遇到右括号
                ans[i] = (i + 1) & 1   #相反的位运算判断,+1就行
        return ans

附:这里利用了位运算判断数字的奇偶性,原理在于二进制中高位数字均为2的幂次方,只有最低位的数字决定了该数的奇偶性,是0为偶数,是1为奇数,所以每次都和1做与运算就可以求出最后一位与1运算的结果,以此来判断奇偶
此处参考:位运算判断一个数为奇偶数

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