思路
- 删除无法匹配的右括号,记录栈中多余左括号的位置
- 删除多余的左括号
- 注意字符串的erase(),删除之后返回当前iter,也就是当前iter被下一个元素代替
代码1
class Solution {
public:
string minRemoveToMakeValid(string s) {
stack<char> sign;
stack<string::iterator> site;
for (auto iter = s.begin(); iter != s.end();) {
if (*iter == '('){
sign.push('(');
site.push(iter);
iter++;
}
else if (*iter == ')') {
if (!sign.empty()){
sign.pop();
site.pop();
iter++;
}
else
s.erase(iter);
}
else
iter++;
}
while(!site.empty()){
s.erase(site.top());
site.pop();
}
return s;
}
};
代码2(将双栈做成pair)
class Solution {
public:
string minRemoveToMakeValid(string s) {
stack<pair<char, string::iterator>> sign;
for (auto iter = s.begin(); iter != s.end();) {
if (*iter == '('){
sign.push(make_pair('(',iter));
iter++;
}
else if (*iter == ')') {
if (!sign.empty()){
sign.pop();
iter++;
}
else{
s.erase(iter);
}
}
else
iter++;
}
while(!sign.empty()){
s.erase(sign.top().second);
sign.pop();
}
return s;
}
};