一开始看到这题就感觉用递归or栈做,递归版本可能太久没写了,是不对的,还是向栈妥协了。
栈中记录的是左括号的下标,当你碰到右括号的时候,将栈顶的左括号和其匹配并出栈,将这两个下标之间的字符串全部翻转,不包括(),包括也没事。最后再遍历tmp之后将其取出()就行了
class Solution {
public:
string reverseParentheses(string s) {
//递归翻转,写个函数,碰到(就进入,碰到)就退出
//将前面翻转好的,加上后面需要翻转的
// string res = "";
// for(int i = 0; i < s.length(); ++i){
// //substr的c
// if(s[i] == '('){
// res += reverseParentheses(s.substr(i + 1));
// }
// else if(s[i] == ')'){
// reverse(res.begin(),res.end());
// return res;
// }
// else res += s[i];
// }
// return res;
//括号匹配问题还是优先考虑stack比较好
//记录下标比较方便,可以从栈顶一直翻转到当前位置
//我们在栈中存的是(的下标
stack<int> sta;
string tmp = "";
for(int i = 0; i < s.length(); ++i){
tmp += s[i];
if(s[i] == '('){
sta.push(i);
}
else if(s[i] == ')'){
int start = sta.top();
sta.pop();//匹配掉了就出栈
//后一个参数是end取不到,所以不用-1
reverse(tmp.begin() + start + 1, tmp.begin() + i);//+1是因为(不要加进去
}
}
string res = "";
for(char ch : tmp){
if(ch != '(' && ch != ')'){
res += ch;
}
}
return res;
}
};