欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-18 19:10:40
我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 1111. 有效括号的嵌套深度 题目 __有效括号字符串__ ......

我的leetcode:

我的leetcode刷题源码[github]:https://github.com/izhoujie/algorithmcii

leetcode 1111. 有效括号的嵌套深度

题目

有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。

嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(a) 表示有效括号字符串 a 的嵌套深度。详情参见题末「嵌套深度」部分。

有效括号字符串类型与对应的嵌套深度计算方法如下图所示:

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

给你一个「有效括号字符串」 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

有效括号字符串:

仅由 "(" 和 ")" 构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:

  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,而 ")(" 和 "(()" 都不是有效括号字符串。

来源:力扣(leetcode)
链接:
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

又是一道读懂题目死掉一大片脑细胞的题...
简单讲就是把给定的有效的()字符串分成两部分,使得()的嵌套最低,因为给定的是合法的串,且分割没有顺序要求,
那么一定可以分成两部分,且每个部分都是若干个()的串联;

题目意思就是这么简单!!!
接下来是如何分,题目要求返回一个01分组的数组标识,既然都是成对的,那么我们可以对(按照第奇数个(分为一部分,第偶数个(分为另一部分,
而对于),按照(的分法反过来分即可,这样就能保证两部分的()都是成对的,且一定是若干个串联的();

思路1-根据索引的奇偶和是否(来标记01,)的标记对应为索引+1后处理;

步骤:

  1. 对于索引index,若当前字符为(,index&1==1标记为1,否则标记为0;
  2. 若当前字符为),上面分析过,)的分配按照(反过来分配,那么我们需要改变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;
	}
}