栈模拟思路:
用str表示当前小括号内的字符串。如果遇到字母,那么加到str中
如果遇到左括号,那么需要把前面一层的str入栈,同时str清零。如果遇到右括号,那么翻转当前str,然后更新str为st.top() + str
class Solution {
public:
string reverseParentheses(string s) {
stack<string> st;
string str;
for (auto c : s) {
if (c == '(') {
st.push(str);
str = "";
} else if (c == ')') {
reverse(str.begin(), str.end());
str = st.top() + str; st.pop();
} else {
str.push_back(c);
}
}
return str;
}
};
这个算法是O(n^2)的,因为存在很多不必要的翻转。
C++递归写法
class Solution {
public:
string reverseParentheses(string s) {
int u = 0;
return dfs(s, u);
}
string dfs(string s, int& u) {
string str;
while(u < s. size()) {
if (s[u] == '(') {
str += dfs(s, ++u);
}
else if (s[u] == ')'){
u++;
reverse(str.begin(), str.end());
return str;
}else {
str.push_back(s[u++]);
}
}
return str;
}
};
优化到O(n)的方法暂略。