标签:出现 turn 类型 字符串类 结果 最小 size 不能 for
有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。
嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。
有效括号字符串类型与对应的嵌套深度计算方法如下图所示:
给你一个「有效括号字符串」seq,请你将其分成两个不相交的有效括号字符串,A 和?B,并使这两个字符串的深度最小。
划分方案用一个长度为 seq.length 的答案数组 answer 表示,编码规则如下:
思路:
在括号字符串有效条件下,最大嵌套深度实际上等于‘(‘连续出现的最大次数。假设嵌套深度最大部分的深度为d,
则划分以后max(depth(A),depth(B))最小一定等于ceil(d/2)。如果有效字符串seq是几个有效字符串的连接,那么
只用考虑嵌套深度最大的部分,因为其它部分一定可以划分为深度都小于ceil(d/2)的两部分。如果部分闭合的有效字
符串深度不超过ceil(d/2),那么加入到A还是B都不会影响结果。
做法:
1.遍历seq,计算出整个字符串的最大深度。
2.遍历seq。
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;
}
标签:出现 turn 类型 字符串类 结果 最小 size 不能 for
原文地址:https://www.cnblogs.com/Frank-Hong/p/13381804.html