Reverse Substrings Between Each Pair of Parentheses

medium stack string parentheses

Problem

You are given a string s that consists of lowercase letters and brackets. Reverse the strings in each pair of matching parentheses, starting from the innermost one. The result should not contain any brackets.

Inputs = "(u(love)i)"
Output"iloveu"
The innermost "love" stays, then "u" + "love" + "i" is reversed to "iloveu".

def reverse_parentheses(s):
    stack = [""]
    for ch in s:
        if ch == "(":
            stack.append("")
        elif ch == ")":
            inner = stack.pop()
            stack[-1] += inner[::-1]
        else:
            stack[-1] += ch
    return stack[0]
function reverseParentheses(s) {
  const stack = [""];
  for (const ch of s) {
    if (ch === "(") {
      stack.push("");
    } else if (ch === ")") {
      const inner = stack.pop();
      stack[stack.length - 1] += [...inner].reverse().join("");
    } else {
      stack[stack.length - 1] += ch;
    }
  }
  return stack[0];
}
class Solution {
    public String reverseParentheses(String s) {
        Deque<StringBuilder> stack = new ArrayDeque<>();
        stack.push(new StringBuilder());
        for (char ch : s.toCharArray()) {
            if (ch == '(') {
                stack.push(new StringBuilder());
            } else if (ch == ')') {
                StringBuilder inner = stack.pop().reverse();
                stack.peek().append(inner);
            } else {
                stack.peek().append(ch);
            }
        }
        return stack.peek().toString();
    }
}
string reverseParentheses(string s) {
    vector<string> stack(1, "");
    for (char ch : s) {
        if (ch == '(') {
            stack.push_back("");
        } else if (ch == ')') {
            string inner = stack.back();
            stack.pop_back();
            reverse(inner.begin(), inner.end());
            stack.back() += inner;
        } else {
            stack.back() += ch;
        }
    }
    return stack[0];
}
Time: O(n) Space: O(n)