【LeetCode】1111. Maximum Nesting Depth of Two Valid Parentheses Strings 有效括号的嵌套深度
- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客:http://fuxuemingzhu.cn/
题目地址:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/
题目描述
有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。
嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。
给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。
- 不相交:每个
seq[i]只能分给 A 和 B 二者中的一个,不能既属于 A 也属于 B 。 - A 或 B 中的元素在原字符串中可以不连续。
A.length + B.length = seq.lengthmax(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]
提示:
1 <= text.size <= 10000
有效括号字符串:
仅由 "(" 和 ")" 构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:
1. 空字符串
2. 连接,可以记作 AB(A 与 B 连接),其中 A 和 B 都是有效括号字符串
3. 嵌套,可以记作 (A),其中 A 是有效括号字符串
嵌套深度:
类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度 depth(S):
1. s 为空时,depth("") = 0
2. s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是有效括号字符串
3. s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串
例如:"","()()",和 "()(()())" 都是有效括号字符串,嵌套深度分别为 0,1,2,而 ")(" 和 "(()" 都不是有效括号字符串。
大家反馈看不懂题目,所以今天题目已经被修改了,下面以最新题目为讲解。
题目讲解
题目已经讲解了“有效括号字符串”和“嵌套深度”,相信大家都能理解。主要的是“划分规则“和”返回结果“没懂。
划分规则讲解
已知输入是个“有效括号字符串”,现在要把输入“分成两个不相交的有效括号字符串”。其实就是把输入字符串划分成两个有效括号字符串 A 和 B。
题目说的“不相交”有点多余,就像给两个小朋友分糖果,肯定不能把一个糖果同时分给两个小朋友啊。题目就把这种分配方式叫做“不相交”。
返回结果讲解
返回结果是要求只包含 0 或者 1 的数组,标记了每个 ( 或者 ) 应该划分给 A 或者 B。
如果一个字符划分给 A 那么就把字符对应的输出为 0,如果划分给 B 那么就把字符对应的输出为 1.
解题方法
题目要求划分成两个有效括号字符串的深度最小,那么只需要让每个有效括号字符串的深度都尽可能低,即 A 和 B 的最大括号嵌套的深度应该最低。所以我们要使这两个字符串的括号深度尽可能均匀。
从左到右遍历字符串,需要知道 A 和 B 加在一起总的未补全的左括号的数目,让这些未补全的左括号尽量平分给 A 和 B。
所以,重点就是 A 和 B 根据总的未补全的左括号轮流认领新的左括号就行了。
具体做法:
- 遇到左括号,如果未补全的左括号个数是奇数,把新的左括号给 A, 如果未补全的左括号个数是偶数,把新的左括号给 B。并且会让未补全的左括号数目加一;
- 遇到右括号,右括号属于A或者B呢?和最后一个左括号分配给A或者B一致。并且会让未补全的左括号数目减一;
看下题目的示例:
示例 1:
输入:seq = "(()())"
输出:[0,1,1,1,1,0]
把输入分成了两个字符串,红色的 A 和 蓝色的 B。这样划分之后红色的深度是 1, 蓝色的深度也是 1. 如下图所示。
示例 2:
输入:seq = "()(())()"
输出:[0,0,0,1,1,0,1,1]
把输入分成了两个字符串,红色的 A 和 蓝色的 B。这样划分之后红色的深度是 1, 蓝色的深度也是 1. 题目的输出只是其中一种结果,下面两种划分分式都可以通过题目测试。如下图所示。
代码
根据上面的分析,我们不需要使用栈结构,只需要记录当前未补全的左括号数目就知道应该把 A 和 B 分配给谁了。
代码注释很详细,相信你一定能看懂。
C++代码如下。
class Solution {
public:
vector<int> maxDepthAfterSplit(string seq) {
const int N = seq.size();
// 结果
vector<int> res(N, 0);
// 未补全的左括号数
int count = 0;
// 当前遍历到的结果的位置
int pos = 0;
// 遍历每个字符
for (char c : seq) {
if (c == '(') {
// 未补全的左括号数增加了
count ++;
// 如果未补全的左括号数是奇数,当前新的左括号分配给A,结果中写0;
// 如果未补全的左括号数是偶数,当前新的左括号分配给B,结果中写1;
res[pos] = 1 - count % 2;
} else {
// 右括号属于A或者B呢?和最后一个左括号分配给A或者B一致
res[pos] = 1 - count % 2;
// 未补全的左括号数减少了
count --;
}
// 结果的位置跟当前遍历到的字符相一致
pos ++;
}
return res;
}
};
欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!
重要:力扣每日一题活动建群啦,一起监督和讨论,我自建监督网址:http://group.ojeveryday.com/#/check,加入方式可以在监督网址中看到。
日期
2020 年 4 月 1 日 —— 纪念王伟烈士
【LeetCode】1111. Maximum Nesting Depth of Two Valid Parentheses Strings 有效括号的嵌套深度的更多相关文章
- 【leetcode】1111. Maximum Nesting Depth of Two Valid Parentheses Strings
题目如下: A string is a valid parentheses string (denoted VPS) if and only if it consists of "(&quo ...
- Java实现 LeetCode 1111 有效括号的嵌套深度(阅读理解题,位运算)
1111. 有效括号的嵌套深度 有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然.详情参见题末「有效括号字符串」部分. 嵌套深度 depth 定义:即有效括号字符串嵌套的层数, ...
- leetCode 20.Valid Parentheses (有效的括号) 解题思路和方法
Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', de ...
- [LeetCode]题解(python):032-Longest Valid Parentheses
题目来源 https://leetcode.com/problems/longest-valid-parentheses/ Given a string containing just the cha ...
- leetcode解题报告(7):Valid Parentheses
描述 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the i ...
- 【LeetCode】20. Valid Parentheses 有效的括号
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:有效,括号,括号匹配,栈,题解,leetcode, 力扣 ...
- LeetCode OJ:Valid Parentheses(有效括号)
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- [LeetCode]20. Valid Parentheses有效的括号
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 【LeetCode】Valid Parentheses(有效的括号)
这道题是LeetCode里的第20道题. 题目要求: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...
随机推荐
- Python基础笔记1
这篇笔记来自廖雪峰的Python教程. 一.Python基础 Python使用缩进来组织代码块,务必遵守约定俗成的习惯,坚持使用4个空格的缩进. 在文本编辑器中,需要设置把Tab自动转换为4个空格,确 ...
- 苹果ios通过描述文件获取udid
苹果ios通过描述文件获取udid 需要准备的东西 1,安装描述文件只支持https的回调地址,所以需要申请https域名 2,描述文件签名,不安装也可,只要能接受红色的字 步骤: 1,准备xml文件 ...
- C#表格GridView显示2位百分比
<asp:BoundField HeaderText="占比" DataField="number" DataFormatString="{0: ...
- 学习java 7.25
学习内容: 特殊边框 1. TitledBorder:它的作用并不是直接为其他组件添加边框,而是为其他边框设置标题,创建该类的对象时,需要传入一个其他的Border对象; 2. CompoundBor ...
- accelerate
accelerate accelerare, accumulare和accurate共享一个含义为to的词根,后半截分别是:fast, pile up, care (关心则精确). 近/反义词: ex ...
- flink-----实时项目---day04-------1. 案例:统计点击、参与某个活动的人数和次数 2. 活动指标多维度统计(自定义redisSink)
1. 案例 用户ID,活动ID,时间,事件类型,省份 u001,A1,2019-09-02 10:10:11,1,北京市 u001,A1,2019-09-02 14:10:11,1,北京市 u001, ...
- ListView的item不能点击(焦点冲突问题)
一般这种问题就是item里面有checkbox或button之类抢占焦点的控件,解决方案有2种: 第一种:就是在checkbox或button添加android:focusable="fal ...
- Linux学习 - 正则表达式
一.正则表达式与通配符 正则表达式:在文件中匹配符合条件的字符串,正则是包含匹配 通配符:用来匹配符合条件的文件名,通配符是完全匹配 二.基础正则表达式 元字符 作用 a* a有0个或任意多个 . 除 ...
- 浅谈iptables与firewalld防火墙
iptables基于包过滤的防火墙工具 ,Linux 内核集成的 IP 信息包过滤系统,对流入和流出服务器的数据包进行精细管理 规则是存储在专用信息包过滤表中 防火墙按照规则做出判断 而netfilt ...
- 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入
参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...