題目描述
有效括號字符串類型與對應的嵌套深度計算方法如下圖所示:
給你一個「有效括號字符串」 seq
,請你將其分成兩個不相交的有效括號字符串,A
和 B
,並使這兩個字符串的深度最小。
- 不相交:每個
seq[i]
只能分給A
和B
二者中的一個,不能既屬於A
也屬於B
。 A
或B
中的元素在原字符串中可以不連續。A.length + B.length = seq.length
- 深度最小:
max(depth(A), depth(B))
的可能取值最小。
如果存在多個滿足要求的答案,只需返回其中任意 一個 即可。
輸入:seq = "()(())()" // 0表示分割A,1表示分給B
輸出:[0,0,0,1,1,0,1,1]
解釋:本示例答案不唯一。
解題思路
本題其實相當於讓 A
字符串和 B
字符串的 depth
儘可能的接近。爲什麼呢?因爲 seq
對應的棧上,每個左括號都對應一個深度,而這個左括號,要麼是 A
的,要麼是 B
的。所以,棧上的左括號只要按奇偶分配給 A
和 B
就可以啦!
更好理解的思路:啥奇偶規律啊?我咋就沒看出來有這規律呢?別慌,我幫你捋捋更簡單實惠的理解方法。
這題是這樣的,要讓A
和B
的最大深度最小,關鍵就是,A\B
你倆的深度誰都別漲太快。別A
的深度都到10
了,B
還0
深度呢。所以很簡單,漲深度的時候,誰比較淺,我就給誰漲。降的時候,誰比較深,我就給誰降。
啥叫“漲深度”呢?那就是'('
啊,來一個左括號,那深度就漲一格,所以A/B
誰淺就給誰漲。深度一樣的話呢,就隨便給漲一個。漲完了你得降啊,啥叫“降深度”呢?那就是右括號啊,右括號來了誰深先降誰。
我的實現
class Solution {
public:
vector<int> maxDepthAfterSplit(string seq) {
int length = seq.size();
vector<int> ans(length, 0);
int a = 0, b = 0;
for(int i = 0; i < length; i++){
char c = seq[i];
if(c == '('){
if(a < b){
a++;
ans[i] = 0;
}else{
b++;
ans[i] = 1;
}
}else if(c == ')'){
if(a > b){
a--;
ans[i] = 0;
}else{
b--;
ans[i] = 1;
}
}
}
return ans;
}
};