【问题描述】
有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 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]提示:1 <= text.size <= 10000有效括号字符串:仅由 "(" 和 ")" 构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:1. 空字符串2. 连接,可以记作 AB(A 与 B 连接),其中 A 和 B 都是有效括号字符串3. 嵌套,可以记作 (A),其中 A 是有效括号字符串
嵌套深度:类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度 depth(S):1. s 为空时,depth("") = 02. s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是有效括号字符串3. s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串例如:"","()()",和 "()(()())" 都是有效括号字符串,嵌套深度分别为 0,1,2,而 ")(" 和 "(()" 都不是有效括号字符串。
【解答思路】
1. 连续的 ‘(’会造成嵌套深度的增加,因此对于这种要把他们分到不同的组中。而连续的标准不仅仅是原始字符串中的左右相邻,应该还包括中间成对的 ‘()’消除后的连续
时间复杂度:O(N) 空间复杂度:O(N)
public class Solution {public int[] maxDepthAfterSplit(String seq) {int len = seq.length();int[] res = new int[len];// 嵌套深度,栈的当前高度int depth = 0;// 在 Java 里,seq.charAt(i) 函数会做下标越界检查,// 因此先转换成字符数组是常见的做法char[] charArray = seq.toCharArray();for (int i = 0; i < len; i++) {// 遇左括号,连续括号个数加 1,if (charArray[i] == '(') {depth++;// %2 也可以写成 & 1,为了保证语义清楚,写 %2res[i] = depth % 2;} else {// 遇到右括号,与之前的嵌套深度(栈顶元素的高度)分在一组,因此先取模,再 --res[i] = depth % 2;depth--;}}return res;}
}作者:liweiwei1419
链接:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/solution/qian-tao-shen-du-wan-cheng-gua-hao-pi-pei-wen-ti-s/
【总结】
1.括号匹配 栈思想
2. 感谢leedcode@Mamba_ZJP
找工作手撕代码环节一般看风水(面试官心情),建议还是多刷题,训练思维,总结方法论,分析过程
3.感谢leedcode@liweiwei1419
-如果面试的时候遇到,心态上先稳住,然后把把题意问清楚,说一点自己的想法和思路,或者可以从面试官那里得到一点提示。
-如果考到的题目完全不在自己的知识贮备里,我个人觉得直接说没有准备这部分的内容,好让面试官调整去讨论你会的问题上,发现你身上的优点,目的还是节约交谈时间,是一种建议的办法。