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"
class Solution {
public String reverseParentheses(String s) {
int n = s.length();
Stack<Integer> opened = new Stack<>();
int[] pair = new int[n];
for (int i = 0; i < n; ++i) {
if (s.charAt(i) == '(')
opened.push(i);
if (s.charAt(i) == ')') {
int j = opened.pop();
pair[i] = j;
pair[j] = i;
}
}
StringBuilder str = new StringBuilder();
for (int i = 0, d = 1; i < n; i += d) {
if (s.charAt(i) == '(' || s.charAt(i) == ')') {
i = pair[i];
d = -d;
} else {
str.append(s.charAt(i));
}
}
return str.toString();
}
}