Program to Reverse a Substring Enclosed Within Brackets in Python



Suppose, we have a lowercase string s that contains letters and parentheses "(" and ")". We have to reverse every string enclosed within parentheses in a recursive manner and return the resultant string.

So, if the input is like s = "back(aps)ce", then the output will be “backspace”.

To solve this, we will follow these steps −

  • Define a function trav() . This will take s, dir, start, close:= close, ans:= ans

    • end := "(" if dir is same as −1, otherwise ")"

    • other := "(" if end is same as ")", otherwise ")"

    • while start < size of s, and s[start] is not same as end, do

      • if s[start] is same as other, then

        • trav(s, -dir, close[other, start] - dir)

        • start := close[other, start] + dir

      • otherwise,

        • insert s[start] at the end of ans

        • start := start + dir

  • From the main function, do the following −

  • ans := a new list

  • close := a new map containing keys “)” and “(” initially the values are two empty maps

  • stack := a new list

  • for each index I and value c in s, do

    • if c is same as "(", then

      • push i into stack

    • otherwise when c is same as ")", then

      • o := top of stack, then pop from stack

      • close[")", i] := o

      • close["(", o] := i

  • trav(s, 1, 0)

  • return ans joined with blank string

Let us see the following implementation to get better understanding −

Example

 Live Demo

class Solution:
   def solve(self, s):
      ans = []
      close = {")": {}, "(": {}}
      stack = []
      for i, c in enumerate(s):
         if c == "(":
            stack.append(i)
         elif c == ")":
            o = stack.pop()
            close[")"][i] = o
            close["("][o] = i
      def trav(s, dir, start, close=close, ans=ans):
         end = "(" if dir == -1 else ")"
         other = "(" if end == ")" else ")"
         while start < len(s) and s[start] != end:
            if s[start] == other:
               trav(s, −dir, close[other][start] − dir)
               start = close[other][start] + dir
            else:
               ans.append(s[start])
               start += dir
      trav(s, 1, 0)
      return "".join(ans)
ob = Solution()
print(ob.solve("back(aps)ce"))

Input

"back(aps)ce"

Output

backspace

Advertisements