# Insert minimum parantheses to make string balanced

• Last Updated : 28 Apr, 2020

Given a string of digits S. The task is to insert a minimum number of opening and closing parentheses into the string S such that the resulting string is balanced and each digit d must be inside d pairs of matching parentheses.

Examples:

Input: S = 221
Output: ((22)1)
Explanation:
The string ((2))((2))(1) is not valid solutions because it is not of minimum length.

Input: S = 3102
Output: (((3))1)0((2))

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

1. First, we will insert the required opening parentheses for the first element and store its value in p.
2. Then we iterate over the string from 1 to length of string and
• Subtract current element from the previous element (int(S[i-1]) – int(S[i])) and store its value in a variable w.
• If w >= 0 then insert w closing parentheses and update p to (p – w). Otherwise,
• Insert current value minus p (int(S[i]) – p) opening parentheses and update p to equals to the current value.
• At the end of the loop, we balance parentheses by inserting the required closing parentheses.

Below is the implementation of the above approach:

 `# Python 3 implementation to balance ``# the string`` ` `# Function to insert matching parantheses``def` `ParanthesesNesting(S):`` ` `    ``# To check first element if 0 or not``    ``if` `S[``0``]``=``=``'0'``:``        ``out ``=``'0'``        ``p ``=` `0`` ` `    ``else``:``        ``out ``=``'('``*``(``int``(S[``0``])) ``+` `S[``0``]``        ``p ``=` `int``(S[``0``])`` ` `    ``# Loop from 1 to length of input_string``    ``for` `i ``in` `range``(``1``, (``len``(S))):``        ``w ``=` `int``(S[i ``-` `1``]) ``-` `int``(S[i])`` ` `        ``# To check w is greater than or ``        ``# equal to zero or not``        ``if``(w >``=` `0``):``            ``out ``=` `out ``+` `')'` `*` `int``(w) ``+` `S[i]``            ``p ``=` `p ``-` `w`` ` `        ``else``:``            ``out ``=` `out ``+` `'('` `*` `(``int``(S[i]) ``-` `p) ``+` `S[i]``            ``p ``=` `int``(S[i])`` ` `    ``y ``=` `out.count(``'('``) ``-` `out.count(``')'``)``    ``out ``+``=` `')'` `*` `int``(y)``    ``return``(out)`` ` `# Driver code ``if` `__name__ ``=``=` `'__main__'``: ``    ``string ``=``'221'``    ``print``(ParanthesesNesting(string))`
Output:
```((22)1)
```

My Personal Notes arrow_drop_up