LeetCode 1111. 有效括号的嵌套深度
2020-04-01 16:11:04来源:博客园 阅读 ()
LeetCode 1111. 有效括号的嵌套深度
我的LeetCode:https://leetcode-cn.com/u/ituring/
我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii
LeetCode 1111. 有效括号的嵌套深度
题目
有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。
嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。
有效括号字符串类型与对应的嵌套深度计算方法如下图所示:
给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和?B,并使这两个字符串的深度最小。
-
不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于 A 也属于 B 。
-
A 或 B 中的元素在原字符串中可以不连续。
-
A.length + B.length = seq.length
-
深度最小:max(depth(A), depth(B))?的可能取值最小。?
划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下: -
answer[i] = 0,seq[i] 分给 A 。
-
answer[i] = 1,seq[i] 分给 B 。
如果存在多个满足要求的答案,只需返回其中任意 一个 即可。
示例 1:
输入:seq = "(()())"
输出:[0,1,1,1,1,0]
示例 2:
输入:seq = "()(())()"
输出:[0,0,0,1,1,0,1,1]
解释:本示例答案不唯一。
按此输出 A = "()()", B = "()()", max(depth(A), depth(B)) = 1,它们的深度最小。
像 [1,1,1,0,0,1,1,1],也是正确结果,其中 A = "()()()", B = "()", max(depth(A), depth(B)) = 1 。
提示:
1 <?seq.size <= 10000
有效括号字符串:
仅由?"(" 和?")"?构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:
- 空字符串
- 连接,可以记作?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,而?")(" 和?"(()"?都不是有效括号字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
又是一道读懂题目死掉一大片脑细胞的题...
简单讲就是把给定的有效的()字符串分成两部分,使得()的嵌套最低,因为给定的是合法的串,且分割没有顺序要求,
那么一定可以分成两部分,且每个部分都是若干个()的串联;
题目意思就是这么简单!!!
接下来是如何分,题目要求返回一个01分组的数组标识,既然都是成对的,那么我们可以对(按照第奇数个(分为一部分,第偶数个(分为另一部分,
而对于),按照(的分法反过来分即可,这样就能保证两部分的()都是成对的,且一定是若干个串联的();
思路1-根据索引的奇偶和是否(来标记01,)的标记对应为索引+1后处理;
步骤:
- 对于索引index,若当前字符为(,index&1==1标记为1,否则标记为0;
- 若当前字符为),上面分析过,)的分配按照(反过来分配,那么我们需要改变index的奇偶性,+1或者-1均可,即(index+1)&1或(index-1)&1
算法源码示例
package leetcode;
/**
* @author ZhouJie
* @date 2020年4月1日 下午9:57:59
* @Description: 1111. 有效括号的嵌套深度
*
*/
public class LeetCode_1111 {
}
class Solution_1111 {
/**
* @author: ZhouJie
* @date: 2020年4月1日 下午9:58:36
* @param: @param seq
* @param: @return
* @return: int[]
* @Description: 1-题目太啰嗦,简单讲就是将()平均分成两块,最后它们的深度必都为1,题目要求返回数组形式;
* 步骤:按顺序把第奇数个(放一起,把第偶数个(放一起,剩下的)反之分配;
*/
public int[] maxDepthAfterSplit_1(String seq) {
int[] rst = new int[seq.length()];
int index = 0;
for (char c : seq.toCharArray()) {
// 下面3行代码都是正确的,取任意一行即可
rst[index++] = c == '(' ? index & 1 : (index + 1) & 1;
// rst[index++] = c == '(' ? index & 1 : (index - 1) & 1;
// rst[index++] = (index & 1) ^ (c == '(' ? 1 : 0);
}
return rst;
}
}
原文链接:https://www.cnblogs.com/izhoujie/p/12616794.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:太赞了!阿里几位工程师重写了 《Java 并发编程》
下一篇:Java基础(五)
- LeetCode 287. 寻找重复数 2020-05-31
- MySQL如何有效的存储IP地址 2020-05-30
- ahjesus-2020 Intellij idea 最新注册码 已稳定数月 亲测有 2020-05-25
- LeetCode 5. 最长回文子串 2020-05-22
- LeetCode 21. 合并两个有序链表 2020-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash