有效括號(hào)字符串 定義:對(duì)于每個(gè)左括號(hào)庞钢,都能找到與之對(duì)應(yīng)的右括號(hào)瞳购,反之亦然。詳情參見(jiàn)題末「有效括號(hào)字符串」部分玖绿。
嵌套深度 depth 定義:即有效括號(hào)字符串嵌套的層數(shù)敛瓷,depth(A) 表示有效括號(hào)字符串 A 的嵌套深度僚匆。詳情參見(jiàn)題末「嵌套深度」部分野来。
有效括號(hào)字符串類型與對(duì)應(yīng)的嵌套深度計(jì)算方法如下圖所示:
給你一個(gè)「有效括號(hào)字符串」 seq,請(qǐng)你將其分成兩個(gè)不相交的有效括號(hào)字符串变丧,A 和 B蚀瘸,并使這兩個(gè)字符串的深度最小狡蝶。
不相交:每個(gè) seq[i] 只能分給 A 和 B 二者中的一個(gè),不能既屬于 A 也屬于 B 贮勃。
A 或 B 中的元素在原字符串中可以不連續(xù)贪惹。
A.length + B.length = seq.length
深度最小:max(depth(A), depth(B)) 的可能取值最小寂嘉。
劃分方案用一個(gè)長(zhǎng)度為 seq.length 的答案數(shù)組 answer 表示奏瞬,編碼規(guī)則如下:
answer[i] = 0,seq[i] 分給 A 泉孩。
answer[i] = 1硼端,seq[i] 分給 B 。
如果存在多個(gè)滿足要求的答案寓搬,只需返回其中任意 一個(gè) 即可珍昨。
示例 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],也是正確結(jié)果唾琼,其中 A = "()()()", B = "()", max(depth(A), depth(B)) = 1 兄春。
提示:
1 < seq.size <= 10000
有效括號(hào)字符串:
僅由 "(" 和 ")" 構(gòu)成的字符串,對(duì)于每個(gè)左括號(hào)父叙,都能找到與之對(duì)應(yīng)的右括號(hào)神郊,反之亦然肴裙。
下述幾種情況同樣屬于有效括號(hào)字符串:
- 空字符串
- 連接趾唱,可以記作 AB(A 與 B 連接),其中 A 和 B 都是有效括號(hào)字符串
- 嵌套蜻懦,可以記作 (A)甜癞,其中 A 是有效括號(hào)字符串
嵌套深度:
類似地,我們可以定義任意有效括號(hào)字符串 s 的 嵌套深度 depth(S):
- s 為空時(shí)宛乃,depth("") = 0
- s 為 A 與 B 連接時(shí)悠咱,depth(A + B) = max(depth(A), depth(B))蒸辆,其中 A 和 B 都是有效括號(hào)字符串
- s 為嵌套情況,depth("(" + A + ")") = 1 + depth(A)析既,其中 A 是有效括號(hào)字符串
例如:""躬贡,"()()",和 "()(()())" 都是有效括號(hào)字符串眼坏,嵌套深度分別為 0拂玻,1,2宰译,而 ")(" 和 "(()" 都不是有效括號(hào)字符串檐蚜。
class Solution {
public int[] maxDepthAfterSplit(String seq) {
if(seq==null || seq.length()==0) return new int[0];
int depth=0;
int[] res=new int[seq.length()];
for(int i=0;i<seq.length();i++){
if(seq.charAt(i)=='('){
res[i]=(++depth)%2;
}else{
res[i]=(depth--)%2;
}
}
return res;
}
}