仅由 ( 和 ) 构成的字符串,对于每个左括号,都能找到与之对应的右括号,反之亦然。
下述几种情况同样属于有效括号字符串:
1. 空字符串
2. 连接,可以记作AB,其中 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 是有效括号字符串
给你一个「有效括号字符串」 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 。
如果存在多个满足要求的答案,只需返回其中任意 一个 即可。
由深度的定义可知,应尽可能将成对的括号均分给A和B以确保深度最小。
显然,左括号对应嵌套深度+1,右括号对应嵌套深度-1。因此,只需要把成对的括号按嵌套深度的奇偶性拆分为两组即可。代码如下:
class Solution {
public int[] maxDepthAfterSplit(String seq) {
int[] result = new int[seq.length()];
int depth = 0;
// 将奇数深度分给A,偶数深度分给B
for (int i=0; i < seq.length(); i++) {
if (seq.charAt(i) == ‘(‘) {
depth++;
result[i] = (depth+1) % 2;
}else {
depth--;
// 右括号使深度减小,需要对其划分逻辑取反
result[i] = depth % 2;
}
}
return result;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文:https://www.cnblogs.com/aries99c/p/12616941.html