Insert minimum parentheses to make string balanced
Last Updated :
03 Feb, 2023
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))
Approach:
- First, we will insert the required opening parentheses for the first element and store its value in p.
- 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 equal 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:
C++
#include <bits/stdc++.h>
using namespace std;
string ParenthesesNesting(string& S)
{
string out = "" ;
int p;
if (S[0] == '0' ) {
out = "0" ;
p = 0;
}
else {
int t = (S[0] - '0' );
while (t--) {
out += '(' ;
}
out += S[0];
p = (S[0] - '0' );
}
for ( int i = 1; i < S.size(); i++) {
int w = (S[i - 1] - '0' ) - (S[i] - '0' );
if (w >= 0) {
int t = w;
while (t--) {
out += ')' ;
}
out += S[i];
p = p - w;
}
else {
int t = (S[i] - '0' ) - p;
while (t--) {
out += '(' ;
}
out += +S[i];
p = int (S[i]);
}
}
int y = count(out.begin(), out.end(), '(' )
- count(out.begin(), out.end(), ')' );
out += ')' * int (y);
return (out);
}
int main()
{
string S = "221" ;
cout << ParenthesesNesting(S);
return 0;
}
|
Java
import java.util.Arrays;
public class Gfg {
static String ParenthesesNesting(String S)
{
String out = "" ;
int p;
if (S.charAt( 0 ) == '0' ) {
out = "0" ;
p = 0 ;
}
else {
int t = (S.charAt( 0 ) - '0' );
while (t-- > 0 ) {
out += '(' ;
}
out += S.charAt( 0 );
p = (S.charAt( 0 ) - '0' );
}
for ( int i = 1 ; i < S.length(); i++) {
int w = (S.charAt(i - 1 ) - '0' )
- (S.charAt(i) - '0' );
if (w >= 0 ) {
int t = w;
while (t-- > 0 ) {
out += ')' ;
}
out += S.charAt(i);
p = p - w;
}
else {
int t = (S.charAt(i) - '0' ) - p;
while (t-- > 0 ) {
out += '(' ;
}
out += S.charAt(i);
p = S.charAt(i);
}
}
int y = ( int )out.chars()
.filter(ch -> ch == '(' )
.count()
- ( int )out.chars()
.filter(ch -> ch == ')' )
.count();
while (y-- > 0 ) {
out += ')' ;
}
return out;
}
public static void main(String[] args)
{
String S = "221" ;
System.out.println(ParenthesesNesting(S));
}
}
|
Python3
def ParenthesesNesting(S):
if S[ 0 ] = = '0' :
out = '0'
p = 0
else :
out = '(' * ( int (S[ 0 ])) + S[ 0 ]
p = int (S[ 0 ])
for i in range ( 1 , ( len (S))):
w = int (S[i - 1 ]) - int (S[i])
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)
if __name__ = = '__main__' :
string = '221'
print (ParenthesesNesting(string))
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class GFG {
static string ParenthesesNesting( string S)
{
string output = "" ;
int p;
if (S[0] == '0' ) {
output = "0" ;
p = 0;
}
else {
int t = (S[0] - '0' );
while (t-->0) {
output += '(' ;
}
output += S[0];
p = (S[0] - '0' );
}
for ( int i = 1; i < S.Length; i++) {
int w = (S[i - 1] - '0' ) - (S[i] - '0' );
if (w >= 0) {
int t = w;
while (t-->0) {
output += ')' ;
}
output += S[i];
p = p - w;
}
else {
int t = (S[i] - '0' ) - p;
while (t-->0) {
output += '(' ;
}
output += S[i];
p = S[i]- '0' ;
}
}
int y = output.Count(c => c == '(' )
- output.Count(c => c == ')' );
while (y-->0)
output+= ')' ;
return (output);
}
public static void Main()
{
string S = "221" ;
Console.Write(ParenthesesNesting(S));
}
}
|
Javascript
function ParenthesesNesting( S)
{
let out = "" ;
let p;
if (S[0] == '0' ) {
out = "0" ;
p = 0;
}
else {
let t = parseInt(S[0]);
while (t--) {
out += '(' ;
}
out += S[0];
p = parseInt(S[0]);
}
for (let i = 1; i < S.length; i++) {
let w = parseInt(S[i - 1]) - parseInt(S[i]);
if (w >= 0) {
let t = w;
while (t--) {
out += ')' ;
}
out += S[i];
p = p - w;
}
else {
let t = parseInt(S[i]) - p;
while (t--) {
out += '(' ;
}
out += +S[i];
p = parseInt(S[i]);
}
}
let c1=0, c2=0;
for (let i=0; i<out.length; i++)
{
if (out[i]== '(' )
c1++;
if (out[i]== ')' )
c2++;
}
let y = c1-c2;
while (y--)
out += ')' ;
return (out);
}
let S = "221" ;
console.log(ParenthesesNesting(S));
|
Time Complexity: O(n) where n is the length of the string
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...