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运算的结果,以此来判断奇偶
此处参考:位运算判断一个数为奇偶数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值