题目描述
给你一个由 '('
、')'
和小写字母组成的字符串 s
。你需要从字符串中删除最少数目的 '('
或者 ')'
(可以删除任意位置的括号),使得剩下的「括号字符串」有效。
输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
解题思路
堆栈模拟去除括号。
常规的判断括号字符串是不是合法的括号对的方法:**遇到左括号,则压入堆栈;遇到右括号,则判断堆栈是否为空;此时,如果堆栈为空,则字符串非法;反之,则弹出栈顶的左括号;最终遍历完字符串之后,如果堆栈非空,则字符串非法。**上面的算法有个特点,压入堆栈的一定都是左括号,右括号不会被压入堆栈。
然而这一题却不同,我们需要将非法的右括号同样也压入堆栈,在遍历完字符串之后,将堆栈内的括号全部从字符串中移除,得到的即为这道题的答案。最后查看堆栈的话,同样也可以发现一个特点,堆栈内的右括号一定是在左括号之前。(废话!如果左括号在前,不就左右配对消失了么)
注:
string
删除指定位置的字符可以这么操作:str.erase(tmpStack.top(), 1);
参考代码
class Solution {
public:
string minRemoveToMakeValid(string str) {
int length = str.size();
if(length == 0)
return "";
stack<int> tmpStack;
for(int i = 0; i < length; i++){
if(str[i] == '('){
tmpStack.push(i);
}else if(str[i] == ')'){
if(!tmpStack.empty() && str[tmpStack.top()] == '(')
tmpStack.pop();
else
tmpStack.push(i);
}
}
while(!tmpStack.empty()){
str.erase(tmpStack.top(), 1);
tmpStack.pop();
}
return str;
}
};