每一个字符串,比如 (())()()Abc(DEF)(g)))(hi)((
,去除所有匹配括号,也就是变成 AbcDEFg))hi((
。
可以从左往右遍历,也可以从右往左遍历。这种左右括号的题目,一般都要用栈,从左往右的方式如下:
void erase_braces(string& s) {
stack<int> st;
for(int i = 0; i < s.length(); ++i) {
if (s[i] == '(')
st.push(i);
else if(s[i] == ')' && !st.empty()) {
s.erase(i, 1);
s.erase(st.top(), 1);
st.pop();
i -= 2;
}
}
}
int main() {
string s = "(())()()Abc(DEF)(g)))(hi)((";
erase_braces(s);
cout << s << endl; // AbcDEFg))hi((
}
值得注意的是,从右往左的话,每次erase,stack里边的索引就不对了,需要进行处理才行。