想啥呢,我哪来的女朋友?今天是愚人节,还是给我老老实实做题吧。

题目链接

LeetCode 1111. 有效括号的嵌套深度[1]

题目描述

题面太长晦涩不想看,请直接跳到最后一段。

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

  • 空字符串
  • 连接,可以记作 ABAB 连接),其中 AB 都是有效括号字符串
  • 嵌套,可以记作 (A),其中 A 是有效括号字符串

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

  • s 为空时,depth("") = 0
  • sAB 连接时,depth(A + B) = max(depth(A), depth(B)),其中 AB 都是有效括号字符串
  • s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串

例如:"""()()",和 "()(()())" 都是有效括号字符串,嵌套深度分别为 012,而 ")(""(()" 都不是有效括号字符串。

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

现在,你需要从中选出 任意 一组有效括号字符串 AB,使 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]
解释:
拆成 "()" 和 "()()" ,最大嵌套深度为 1

示例2

        输入:
seq = "()(())()"
输出:
[0,0,0,1,1,0,1,1]
解释:
拆成 "()()" 和 "()()" ,最大嵌套深度为 1

说明:

  • 1 <= text.size <= 10000

题解

既然想要两个子序列的嵌套深度中较大者尽量小,那么我们最好能够让两个子序列的嵌套深度相同。

再考虑任意一个原序列中嵌套深度为 的合法子序列,我们要想办法把它拆成两半。那么最优的方法肯定是一半嵌套深度为 ,一半是 。这样两个子序列中嵌套深度较大值就是 ,而其它任何分法都会导致较大值大于它。

那么怎么样才能对半分呢?这个其实随意了,但是最为方便的方法就是,嵌套深度为奇数的作为一个子序列,偶数的作为另一个子序列,这样就对半分了,代码还好写。

具体实现上,我们用一个变量 来表示当前括号的嵌套深度,那么遇到左括号就深度加一,遇到右括号嵌套深度就是当前的 ,但是遍历完这个括号之后,深度要减一,然后嵌套深度为奇数的括号位置处标记为 1 就行了。

伪代码也就是:

        if c = '('cnt := cnt + 1mask := cnt&1
elsemask := cnt&1cnt := cnt - 1

简化

其实我们可以注意到,不管是加一还是减一,奇偶性的变化都是一致的,也就是减一之后的奇偶性和加一之后是相同的。

所以我们把减一也变成加一,那么不管遇到什么括号,都是 加一了,那不就变成了下标 了吗?

我们把上面的伪代码按照这种思路改变一下:

        if c = '('cnt := cnt + 1mask := cnt&1
elsemask := cnt&1cnt := cnt + 1

然后用下标 替换掉 :

        if c = '('mask := (i+1)&1
elsemask := i&1

继续改写一下,让形式统一一点:

        if c = '('mask := ~(i&1)
elsemask := i&1

那么最后就可以把这两种情况合并了,也就是标记值直接就等于 (i&1)^(c='(')

当然我是从代码的角度,从奇偶性推过来的,官方题解是直接严格证明了正确性:

官方题解:LeetCode 1111. 有效括号的嵌套深度[2]

代码

c++

        class Solution {public:vector<int> maxDepthAfterSplit(string seq) {int cnt = 0;vector<int> res;for (auto c : seq) {if (c == '(') {res.push_back((++cnt)&1);} else {res.push_back((cnt--)&1);}}return res;}
};

python

        class Solution:def maxDepthAfterSplit(self, seq: str) -> List[int]:cnt = 0res = []for c in seq:if c == '(':cnt += 1res.append(cnt&1)else:res.append(cnt&1)cnt -= 1return res

简化(c++)

        class Solution {public:vector<int> maxDepthAfterSplit(string seq) {vector<int> res;for (int i = 0, sz = seq.size(); i < sz; ++i) {res.push_back((i&1)^(seq[i]=='('));}return res;}
};

简化(python)

        class Solution:def maxDepthAfterSplit(self, seq: str) -> List[int]:res = []for i, c in enumerate(seq):res.append((i&1)^(c=='('))return res

参考资料

[1]

LeetCode 1111. 有效括号的嵌套深度: https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/

[2]

官方题解:LeetCode 1111. 有效括号的嵌套深度: https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/solution/you-xiao-gua-hao-de-qian-tao-shen-du-by-leetcode-s/

【每日算法Day 87】今天我脱单了,所以大家不用做题了!相关推荐

  1. 程序猿脱单,相亲该怎么做,好的相亲套路助你今年不再单身

    当婚姻成了一种交易 当爱情失去了存在的意义 当年少时的奋勇被时间埋葬 当身边的人越来越紧密的交卷 当家长开始为你物色对象 我悲哀却也无奈 从被安排相亲时的惊讶 而后赶鸭子上架的愤怒 临场时的忐忑 见面 ...

  2. ((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第6天(动态规划 专题)】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有61天

  3. 程序员 520 脱单指南!

    作者 | 周志鹏 责编 | 伍杏玲 [CSDN 编者按]今天520,朋友圈一秒变成大型"虐狗现场",单身程序员表示"也想谈恋爱"啊,那么如何找到心仪的TA,程序 ...

  4. 一元一个脱单盲盒,“线上月老”是门赚钱的好生意吗?

    "想脱单吗?里面都是微信号,一元拿一个,一元留一个",最近在各大街头夜市上,能够看见不少摊主正在贩卖"脱单盲盒",摊位名叫"月老办事处",吸 ...

  5. 老板发公告:11月成功程序员脱单,奖15天年假!

    整理 | 王晓曼 来源 | 程序人生 (ID:coder _life) 近日,上海一创业公司贴出的"脱单公告",引起不少网友的关注. 老板为员工脱单操碎心 据了解,该公司大部分都是 ...

  6. 漫谈程序员系列:快来约这些女生,保你脱单

    最近和同事.朋友.网友聊天,聊到程序员谈女朋友的事情,发现了一些有趣的东西,分享出来. 八卦了周围干开发的程序员的另一半的职业,发现了下列组合: 程序员+测试 程序员+美工 程序员+售前 程序员+程序 ...

  7. 几个 Linux 耍酷命令,手把手教你如何技术撩妹!技术脱单

    点击关注公众号,回复"1024"获取2TB学习资源! 一入运维深似海,从此女友是路人~自打进入技术运维领域,相信很多小伙伴每日都是技术身傍(绑),Linux .docker.k8s ...

  8. 2019/11/11 还是没能脱单噻

    可要怎么脱单呢??????? 今日事项 做5道OJ的题 读一篇文献 MATLAB搭建六自由度机械臂模型 培养计划修改和签字 学习强国41分&每周答题 一.今日OJ系统解题 1.计算两点间的距离 ...

  9. 从微视“脱单”看短视频的社交价值

    双十一来临,剩男剩女的话题再次突现在世人面前.网络.媒体上的相关报道连篇累牍,一些组织.商家.婚恋类网站还争先恐后举办大型相亲活动,为这些疏于社交的单身一族开辟邂逅通道.与往年不同,今年"相 ...

  10. 5G 来了,你离脱单还有多远?

    今年 6 月 6 日 工信部正式向 中国电信.中国移动 中国联通.中国广电 发放 5G 商用牌照 我国正式进入 5G 商用元年 没错 5G 真的要来来来来来来啦! 图片来自 teckflock 作为科 ...

最新文章

  1. 解决Fiddler无法抓到手机的会话包
  2. CSS垂直翻转/水平翻转提高web页面资源重用性
  3. 2018-2019-1 20165335 《信息安全系统设计基础》第六周学习总结
  4. Oracle触发器简单使用记录
  5. 一个volatile跟面试官扯了半个小时
  6. 干货篇:创业对待数据挖掘要注意这5点
  7. vue+mintUI搭建移动端新闻类网站
  8. bootstrap4高度占一半_减肥选对了碳水,意味着成功了一半
  9. MySQL select
  10. VS2017无法保存工具栏布局信息
  11. DevExpress GridView 排序状态下新增行不参与排序
  12. Unsupervised Deep Homography - Pytorch实现
  13. 阅读基地畅销榜数据抓取
  14. Android调用手机自带图库选择图片
  15. 【不知出处】危险的迷宫 网络流 费用流
  16. Android Studio记录一个错误:解析软件包时出现问题
  17. 关于LDO和DC-DC,看这一篇就够了!
  18. php异步执行shell脚本
  19. js中Numer类型最大值9007199254740991,精度丢失问题解决
  20. android 登陆微信一直卡在验证身份,微信登录需要滑块验证的时候,闪退返回至登录界面...

热门文章

  1. Unity Ragdoll 实现死亡效果 心得+坑点总结
  2. 两个栈实现队列 以及两个队列实现栈
  3. sql server 跨服务器查询数据
  4. JAVA 大作业——DAY 3
  5. ASP.NET MVC Links
  6. LeetCode每日一题——剑指 Offer 10- I. 斐波那契数列
  7. Luogu4402 机械排序
  8. datax源代码编译安装
  9. [Matlab]切比雪夫Ⅱ型滤波器设计:低通、高通、带通和带阻
  10. jvisualvm工具使用