A string is a valid parentheses string (denoted VPS) if and only if it consists of "(" and ")" characters only, and:
It is the empty string, or
It can be written as AB (A concatenated with B), where A and B are VPS’s, or
It can be written as (A), where A is a VPS.
We can similarly define the nesting depthdepth(S) of any VPS S as follows:
depth("") = 0
depth(A + B) = max(depth(A), depth(B)), where A and B are VPS’s
depth("(" + A + ")") = 1 + depth(A), where A is a VPS.
For example, "", "()()", and "()(()())" are VPS’s (with nesting depths 0, 1, and 2), and ")(" and "(()" are not VPS’s.
Given a VPS seq, split it into two disjoint subsequences A and B, such that A and B are VPS’s (and A.length + B.length = seq.length).
Now choose any such A and B such that max(depth(A), depth(B)) is the minimum possible value.
Return an answer array (of length seq.length) that encodes such a choice of A and B: answer[i] = 0 if seq[i] is part of A, else answer[i] = 1. Note that even though multiple answers may exist, you may return any of them.
To minimize the maximum nesting depth when splitting the parentheses into two valid strings, we can alternate the assignment of each parenthesis to one of the two groups based on the current depth. This ensures the depths are balanced between the two strings.
classSolution {
publicint[]maxDepthAfterSplit(String seq) {
int n = seq.length(), depth = 0;
int[] ans =newint[n];
for (int i = 0; i < n; ++i) {
if (seq.charAt(i) =='(') {
ans[i]= depth % 2;
depth++;
} else {
depth--;
ans[i]= depth % 2;
}
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funmaxDepthAfterSplit(seq: String): IntArray {
val ans = IntArray(seq.length)
var depth = 0for (i in seq.indices) {
if (seq[i] =='(') {
ans[i] = depth % 2 depth++ } else {
depth-- ans[i] = depth % 2 }
}
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution:
defmaxDepthAfterSplit(self, seq: str) -> list[int]:
ans = []
depth =0for c in seq:
if c =='(':
ans.append(depth %2)
depth +=1else:
depth -=1 ans.append(depth %2)
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
impl Solution {
pubfnmax_depth_after_split(seq: String) -> Vec<i32> {
letmut ans = Vec::with_capacity(seq.len());
letmut depth =0;
for c in seq.chars() {
if c =='(' {
ans.push((depth %2) asi32);
depth +=1;
} else {
depth -=1;
ans.push((depth %2) asi32);
}
}
ans
}
}