# Minimum number of bracket reversals needed to make an expression balanced

Given an expression with only ‘}’ and ‘{‘. The expression may not be balanced. Find minimum number of bracket reversals to make the expression balanced.

Examples:

```Input:  exp = "}{"
Output: 2
We need to change '}' to '{' and '{' to
'}' so that the expression becomes balanced,
the balanced expression is '{}'

Input:  exp = "{{{"
Output: Can't be made balanced using reversals

Input:  exp = "{{{{"
Output: 2

Input:  exp = "{{{{}}"
Output: 1

Input:  exp = "}{{}}{{{"
Output: 3
```

One simple observation is, the string can be balanced only if total number of brackets is even (there must be equal no of ‘{‘ and ‘}’)

A Naive Solution is to consider every bracket and recursively count number of reversals by taking two cases (i) keeping the bracket as it is (ii) reversing the bracket. If we get a balanced expression, we update result if number of steps followed for reaching here is smaller than the minimum so far. Time complexity of this solution is O(2n).

An Efficient Solution can solve this problem in O(n) time. The idea is to first remove all balanced part of expression. For example, convert “}{{}}{{{” to “}{{{” by removing highlighted part. If we take a closer look, we can notice that, after removing balanced part, we always end up with an expression of the form }}…}{{…{, an expression that contains 0 or more number of closing brackets followed by 0 or more numbers of opening brackets.

How many minimum reversals are required for an expression of the form “}}..}{{..{” ?. Let m be the total number of closing brackets and n be the number of opening brackets. We need ⌈m/2⌉ + ⌈n/2⌉ reversals. For example }}}}{{ requires 2+1 reversals.

Below is implementation of above idea.

## C++

 `// C++ program to find minimum number of ` `// reversals required to balance an expression ` `#include ` `using` `namespace` `std; ` ` `  ` `  `// Returns count of minimum reversals for making ` `// expr balanced. Returns -1 if expr cannot be ` `// balanced. ` `int` `countMinReversals(string expr) ` `{ ` `    ``int` `len = expr.length(); ` ` `  `    ``// length of expression must be even to make ` `    ``// it balanced by using reversals. ` `    ``if` `(len%2) ` `       ``return` `-1; ` ` `  `    ``// After this loop, stack contains unbalanced ` `    ``// part of expression, i.e., expression of the ` `    ``// form "}}..}{{..{" ` `    ``stack<``char``> s; ` `    ``for` `(``int` `i=0; i

## Java

 `//Java Code to count minimum reversal for ` `//making an expression balanced. ` ` `  `import` `java.util.Stack; ` ` `  `public` `class` `GFG  ` `{ ` ` `  `    ``// Method count minimum reversal for ` `    ``//making an expression balanced. ` `    ``//Returns -1 if expression cannot be balanced ` `    ``static` `int` `countMinReversals(String expr) ` `    ``{ ` `        ``int` `len = expr.length(); ` `     `  `        ``// length of expression must be even to make ` `        ``// it balanced by using reversals. ` `        ``if` `(len%``2` `!= ``0``) ` `        ``return` `-``1``; ` `     `  `        ``// After this loop, stack contains unbalanced ` `        ``// part of expression, i.e., expression of the ` `        ``// form "}}..}{{..{" ` `        ``Stack s=``new` `Stack<>(); ` `         `  `        ``for` `(``int` `i=``0``; i

## Python3

 `# Python3 program to find minimum number of  ` `# reversals required to balance an expression  ` ` `  `# Returns count of minimum reversals  ` `# for making expr balanced. Returns -1  ` `# if expr cannot be balanced.  ` `def` `countMinReversals(expr):  ` ` `  `    ``lenn ``=` `len``(expr)  ` ` `  `    ``# length of expression must be even  ` `    ``# to make it balanced by using reversals.  ` `    ``if` `(lenn ``%` `2``) : ` `        ``return` `-``1` ` `  `    ``# After this loop, stack contains  ` `    ``# unbalanced part of expression,   ` `    ``# i.e., expression of the form "...."  ` `    ``s ``=` `[]  ` `    ``for` `i ``in` `range``(lenn): ` `        ``if` `(expr[i] ``=``=``'' ``and` `len``(s)):  ` ` `  `            ``if` `(s[``0``] ``=``=` `'') : ` `                ``s.pop(``0``)  ` `            ``else``: ` `                ``s.insert(``0``, expr[i])  ` `        ``else``: ` `            ``s.insert(``0``, expr[i])  ` `     `  `    ``# Length of the reduced expression  ` `    ``# red_len = (m+n)  ` `    ``red_len ``=` `len``(s)  ` ` `  `    ``# count opening brackets at the  ` `    ``# end of stack  ` `    ``n ``=` `0` `    ``while` `(``len``(s)``and` `s[``0``] ``=``=` `'') : ` `            ``s.pop(``0``)  ` `            ``n ``+``=` `1` ` `  `    ``# return ceil(m/2) + ceil(n/2) which ` `    ``# is actually equal to (m+n)/2 + n%2  ` `    ``# when m+n is even.  ` `    ``return` `(red_len ``/``/` `2` `+` `n ``%` `2``)  ` ` `  `# Driver Code  ` `if` `__name__ ``=``=` `'__main__'``:  ` ` `  `    ``expr ``=` `"}}{{"` `    ``print``(countMinReversals(expr.strip()))  ` ` `  `# This code is contributed by ` `# Shubham Singh(SHUBHAMSINGH10) `

## C#

 `// C# Code to count minimum reversal for  ` `// making an expression balanced.  ` `using` `System; ` `using` `System.Collections.Generic; ` ` `  `class` `GFG ` `{ ` ` `  `// Method count minimum reversal for  ` `// making an expression balanced.  ` `// Returns -1 if expression cannot be balanced  ` `public` `static` `int` `countMinReversals(``string` `expr) ` `{ ` `    ``int` `len = expr.Length; ` ` `  `    ``// length of expression must be ` `    ``// even to make it balanced by ` `    ``// using reversals.  ` `    ``if` `(len % 2 != 0) ` `    ``{ ` `        ``return` `-1; ` `    ``} ` ` `  `    ``// After this loop, stack contains  ` `    ``// unbalanced part of expression,  ` `    ``// i.e., expression of the form "}}..}{{..{"  ` `    ``Stack<``char``> s = ``new` `Stack<``char``>(); ` ` `  `    ``for` `(``int` `i = 0; i < len; i++) ` `    ``{ ` `        ``char` `c = expr[i]; ` `        ``if` `(c == ``'}'` `&& s.Count > 0) ` `        ``{ ` `            ``if` `(s.Peek() == ``'{'``) ` `            ``{ ` `                ``s.Pop(); ` `            ``} ` `            ``else` `            ``{ ` `                ``s.Push(c); ` `            ``} ` `        ``} ` `        ``else` `        ``{ ` `            ``s.Push(c); ` `        ``} ` `    ``} ` ` `  `    ``// Length of the reduced expression  ` `    ``// red_len = (m+n)  ` `    ``int` `red_len = s.Count; ` ` `  `    ``// count opening brackets at  ` `    ``// the end of stack  ` `    ``int` `n = 0; ` `    ``while` `(s.Count > 0 && s.Peek() == ``'{'``) ` `    ``{ ` `        ``s.Pop(); ` `        ``n++; ` `    ``} ` ` `  `    ``// return ceil(m/2) + ceil(n/2) which is  ` `    ``// actually equal to (m+n)/2 + n%2 when  ` `    ``// m+n is even.  ` `    ``return` `(red_len / 2 + n % 2); ` `} ` ` `  `// Driver Code  ` `public` `static` `void` `Main(``string``[] args) ` `{ ` `    ``string` `expr = ``"}}{{"``; ` ` `  `    ``Console.WriteLine(countMinReversals(expr)); ` `} ` `} ` ` `  `// This code is contributed by Shrikant13 `

Output:

`2`

Time Complexity: O(n)
Auxiliary Space: O(n)

Thanks to Utkarsh Trivedi for suggesting above approach.

## tags:

Queue Stack Strings Strings Stack Queue