Reverse the strings in each pair of matching parentheses, starting from the innermost one.
Input: s = "(abcd)"
Output: "dcba"
Input: s = "(u(love)i)"
Output: "iloveu"
Explanation: The substring "love" is reversed first, then the whole string is reversed.
Input: s = "(ed(et(oc))el)"
Output: "leetcode"
Explanation: First, we reverse the substring "oc", then "etco", and finally, the whole string.
Input: s = "a(bcdefghijkl(mno)p)q"
Output: "apmnolkjihgfedcbq"
// Brute Force
string reverseParentheses(string s) { // time: O(n^2); space: O(n)
stack<int> st; // store each reverse starting postion
string res;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '(') {
st.push(res.length());
} else if (s[i] == ')') {
int j = st.top(); st.pop();
reverse(res.begin() + j, res.end());
} else {
res += s[i];
}
}
return res;
}
// O(n) Method
string reverseParentheses(string s) { // time: O(n); space: O(n)
int n = s.length();
stack<int> st;
vector<int> pair(n); // parentheses pair
for (int i = 0; i < n; ++i) {
if (s[i] == '(') {
st.push(i);
} else if (s[i] == ')') {
int j = st.top(); st.pop();
pair[i] = j;
pair[j] = i;
}
}
string res;
for (int i = 0, d = 1; i < n; i += d) {
if (s[i] == '(' || s[i] == ')') {
i = pair[i];
d = -d;
} else {
res += s[i];
}
}
return res;
}