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 withB
), whereA
andB
are VPS's, or - It can be written as
(A)
, whereA
is a VPS.
We can similarly define the nesting depth depth(S)
of any VPS S
as follows:
depth("") = 0
depth(A + B) = max(depth(A), depth(B))
, whereA
andB
are VPS'sdepth("(" + A + ")") = 1 + depth(A)
, whereA
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.
Example 1:
Input: seq = "(()())" Output: [0,1,1,1,1,0]
Example 2:
Input: seq = "()(())()" Output: [0,0,0,1,1,0,1,1]
Constraints:
1 <= seq.size <= 10000
class Solution:
def maxDepthAfterSplit(self, seq: str) -> List[int]:
ans = [0] * len(seq)
a = b = 0
for i, c in enumerate(seq):
if c == "(":
if a < b:
a += 1
else:
b += 1
ans[i] = 1
else:
if a > b:
a -= 1
else:
b -= 1
ans[i] = 1
return ans
class Solution {
public int[] maxDepthAfterSplit(String seq) {
int[] res = new int[seq.length()];
for (int i = 0, cnt = 0; i < res.length; ++i) {
if (seq.charAt(i) == '(') {
res[i] = cnt++ & 1;
} else {
res[i] = --cnt & 1;
}
}
return res;
}
}
class Solution {
public int[] maxDepthAfterSplit(String seq) {
int n = seq.length();
int[] ans = new int[n];
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
char c = seq.charAt(i);
if (c == '(') {
if (a < b) {
++a;
} else {
++b;
ans[i] = 1;
}
} else {
if (a > b) {
--a;
} else {
--b;
ans[i] = 1;
}
}
}
return ans;
}
}
class Solution {
public:
vector<int> maxDepthAfterSplit(string seq) {
int n = seq.size();
vector<int> ans(n);
int a = 0, b = 0;
for (int i = 0; i < n; ++i) {
char c = seq[i];
if (c == '(') {
if (a < b)
++a;
else
++b, ans[i] = 1;
} else {
if (a > b)
--a;
else
--b, ans[i] = 1;
}
}
return ans;
}
};
func maxDepthAfterSplit(seq string) []int {
ans := make([]int, len(seq))
a, b := 0, 0
for i, c := range seq {
if c == '(' {
if a < b {
a++
} else {
b++
ans[i] = 1
}
} else {
if a > b {
a--
} else {
b--
ans[i] = 1
}
}
}
return ans
}