链接:https://leetcode-cn.com/problems/minimum-insertions-to-balance-a-parentheses-string
题目
果果念
这道题目模拟面试没有做出来,大概花了一个小时才搞清楚逻辑,自己想的比较复杂,感觉逻辑还是可以再清晰一些。提交了虽然过了,但是时间是56ms,还挺长的,相较于其他方法。
这里直接采用了栈的形式,当然,优秀的解法只需要模拟就可以了。说下我的方法,为了一些()),规定了两种方式,分别是#和*,#代表栈中没有(,遇到了),则合成了#;*代表栈中有(,遇到了),则合成了*;然后按照一些情况进行出栈、进栈即可。见代码一。
这里需要说一下比较好的方法,按照奇偶逻辑进行判断。见代码二,思路很清晰。
代码一
class Solution {
public:
int minInsertions(string s) {
stack<char> brace;
int ans=0;
//特殊符号*,()=*
for(int i=0;i<s.length();i++){
if(s[i]=='('){
brace.push(s[i]);
}else{
if(brace.empty()){
ans+=1;//补充一个(,#
brace.push('#');
}else if(brace.top()=='#'){
//#)
brace.pop();//匹配成功
//需要清空
while(brace.empty()==false){
if(brace.top()=='(')
ans+=2;//())
else if(brace.top()=='*'){
ans+=1;//*)
}
brace.pop();;
}
}else if(brace.top()=='*'){
//没有补充的,*)
brace.pop();
while(brace.empty()==false&&brace.top()!='('){
brace.pop();
ans+=1;
}
}
else if(brace.top()=='('){
brace.pop();
brace.push('*');
}
}
}
while(brace.empty()==false){
if(brace.top()=='(')
ans+=2;
else if(brace.top()=='#'||brace.top()=='*'){
ans+=1;
}
brace.pop();;
}
return ans;
}
};
代码二
太晚了,有点想不通这个思路了,明天补一下。
手把手解决三道括号相关的算法题