1111.有效括号的嵌套深度
有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。
嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。
有效括号字符串类型与对应的嵌套深度计算方法如下图所示:
给你一个「有效括号字符串」seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。
- 不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于 A 也属于 B 。
- A 或 B 中的元素在原字符串中可以不连续。
- A.length + B.length = seq.length
- 深度最小:max(depth(A), depth(B)) 的可能取值最小。
划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下:
- answer[i] = 0,seq[i] 分给 A 。
- answer[i] = 1,seq[i] 分给 B 。
如果存在多个满足要求的答案,只需返回其中任意一个即可。
思路:
在括号字符串有效条件下,最大嵌套深度实际上等于'('连续出现的最大次数。假设嵌套深度最大部分的深度为d,
则划分以后max(depth(A),depth(B))最小一定等于ceil(d/2)。如果有效字符串seq是几个有效字符串的连接,那么
只用考虑嵌套深度最大的部分,因为其它部分一定可以划分为深度都小于ceil(d/2)的两部分。如果部分闭合的有效字
符串深度不超过ceil(d/2),那么加入到A还是B都不会影响结果。
做法:
1.遍历seq,计算出整个字符串的最大深度。
2.遍历seq。
- 遇到'(',当A深度小于ceil(max_depth/2)时,加入A;反之加入B。
- 遇到')',当A中还有未闭合的'('时加入A;反之加入B。
vector<int> maxDepthAfterSplit(string seq) {
vector<int> res(seq.size());
if(seq.size()==0) return res;
//计算出max_len
int len=0,max_len=0;
for(int i=0;i<seq.size();++i){
if(seq[i]=='('){
len++;
if(len>max_len) max_len=len;
}
else len--;
}
//已知max(depth(A),depth(B))=ceil(max_len/2),得出A
int a_depth=0;
int mid=(max_len+1)/2;
for(int i=0;i<seq.size();++i){
if(seq[i]=='('){
if(a_depth<mid) {
a_depth++;
res[i]=0;
}
else{
res[i]=1;
}
}
else{
if(a_depth>0){
a_depth--;
res[i]=0;
}
else{
res[i]=1;
}
}
}
return res;
}