今天总结两道在括号使用上面有关栈的题目。
第一题:删除最外层的括号
有关括号使用有效性或者去除最外层等很容易让我们想到使用栈来解决,
在这道题目中,我们可以借助栈的思想,简化做法,定义一个变量来帮助我们辨别
是否在处理最外层结构。
代码如下:
char * removeOuterParentheses(char * S){
int cnt = 0,k = 0;//cnt为0,则处于最外层
for(int i = 0;i < strlen(S);i++){
if(S[i] == '('){
if(cnt != 0) S[k++] = S[i];//不在最外层
cnt ++;//后加
}
if(S[i] == ')'){
cnt--;//注意这里是先减,去除一对完整的括号
if(cnt != 0) S[k++] = S[i];//不在最外层
}
}
S[k] = '\0';//别忘了这步!
return S;
}
第二题:使括号有效的最小添加
这道题目也是,很容易想到使用栈来解决
代码如下:
int minAddToMakeValid(char * S){
int len = strlen(S);
char stack[len + 1];
int top = -1;//定义栈顶
for(int i = 0; S[i]!='\0'; ++i){
if(top != -1 && stack[top] == '(' && S[i] == ')')//前后一对完整的括号对应,
top--;
else//不满足完整括号对应则入栈
stack[++top] = S[i];
}
return top + 1;//输出需要使整个结构括号完整对应的个数
}