题目描述
有效括号字符串类型与对应的嵌套深度计算方法如下图所示:
给你一个「有效括号字符串」 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;
}
};