Parentheses are said to be balanced when every opening brace has a closing brace like “()()” or “(())” or “(()())” etc. Incorrect balancing includes “)(” or “))((” etc. The task here is to correct the sequence of parentheses in such a way that it is done in minimum cost. And shifting of parentheses by over one parentheses costs 1. If the parentheses can’t be balanced then print -1.
Examples :
Input : ()
Output : 0
Explanation : Already balancedInput : ))((
Output : 4
Explanation : Firstly, ) at position 1st goes to the last position, costing 3, so we get )((). Then, ) at position 1st goes to the 2nd position costing 1. So, finally we get ()(). Therefore, the total cost is 4.
Algorithm :
- Store the braces in string.
- Run a loop to string size to store the count of opening and closing braces.
- Check if number of opening brace is equal to number of closing brace or not.
- If the braces are not equal then print -1 depicting that the string cant be balanced. Else proceed further.
- Initially, Check at 0th index that whether the string contains opening brace or closing brace. If we get an opening brace then store +1 in the array at index 0, else if closing brace is present then place -1 at 0th index.
- Now run a loop from 1st index to array length.
- If opening brace is present at index i then add +1 to value at previous index i.e. i-1 and store sum at index i.
- If closing brace is present at index i then add -1 to value at previous index i.e. i-1 and store sum at index i.
- If value at index i is negative i.e less than 0, then add the absolute value of array[i] into a variable(ans in below program).
- Finally we get the minimum cost in variable ans.
Below is the implementation of above approach :
// CPP code to calculate the minimum cost // to make the given parentheses balanced #include <bits/stdc++.h> using namespace std;
int costToBalance(string s)
{ if (s.length() == 0)
cout << 0 << endl;
// To store absolute count of
// balanced and unbalanced parentheses
int ans = 0;
// o(open bracket) stores count of '(' and
// c(close bracket) stores count of ')'
int o = 0, c = 0;
for ( int i = 0; i < s.length(); i++) {
if (s[i] == '(' )
o++;
if (s[i] == ')' )
c++;
}
if (o != c)
return -1;
int a[s.size()];
if (s[0] == '(' )
a[0] = 1;
else
a[0] = -1;
if (a[0] < 0)
ans += abs (a[0]);
for ( int i = 1; i < s.length(); i++) {
if (s[i] == '(' )
a[i] = a[i - 1] + 1;
else
a[i] = a[i - 1] - 1;
if (a[i] < 0)
ans += abs (a[i]);
}
return ans;
} // Driver code int main()
{ string s;
s = ")))(((" ;
cout << costToBalance(s) << endl;
s = "))((" ;
cout << costToBalance(s) << endl;
return 0;
} |
// Java code to calculate the // minimum cost to make the // given parentheses balanced import java.io.*;
class GFG
{ static int costToBalance(String s)
{
if (s.length() == 0 )
System.out.println( 0 );
// To store absolute count
// of balanced and unbalanced
// parentheses
int ans = 0 ;
// o(open bracket) stores count
// of '(' and c(close bracket)
// stores count of ')'
int o = 0 , c = 0 ;
for ( int i = 0 ; i < s.length(); i++)
{
if (s.charAt(i) == '(' )
o++;
if (s.charAt(i) == ')' )
c++;
}
if (o != c)
return - 1 ;
int []a = new int [s.length()];
if (s.charAt( 0 ) == '(' )
a[ 0 ] = 1 ;
else
a[ 0 ] = - 1 ;
if (a[ 0 ] < 0 )
ans += Math.abs(a[ 0 ]);
for ( int i = 1 ; i < s.length(); i++)
{
if (s.charAt(i) == '(' )
a[i] = a[i - 1 ] + 1 ;
else
a[i] = a[i - 1 ] - 1 ;
if (a[i] < 0 )
ans += Math.abs(a[i]);
}
return ans;
}
// Driver code
public static void main(String args[])
{
String s;
s = ")))(((" ;
System.out.println(costToBalance(s));
s = "))((" ;
System.out.println(costToBalance(s));
}
} // This code is contributed by // Manish Shaw(manishshaw1) |
# Python 3 code to calculate the minimum cost # to make the given parentheses balanced def costToBalance(s):
if ( len (s) = = 0 ):
print ( 0 )
# To store absolute count of
# balanced and unbalanced parenthesis
ans = 0
# o(open bracket) stores count of '(' and
# c(close bracket) stores count of ')'
o = 0
c = 0
for i in range ( len (s)):
if (s[i] = = '(' ):
o + = 1
if (s[i] = = ')' ):
c + = 1
if (o ! = c):
return - 1
a = [ 0 for i in range ( len (s))]
if (s[ 0 ] = = '(' ):
a[ 0 ] = 1
else :
a[ 0 ] = - 1
if (a[ 0 ] < 0 ):
ans + = abs (a[ 0 ])
for i in range ( 1 , len (s)):
if (s[i] = = '(' ):
a[i] = a[i - 1 ] + 1
else :
a[i] = a[i - 1 ] - 1
if (a[i] < 0 ):
ans + = abs (a[i])
return ans
# Driver code if __name__ = = '__main__' :
s = ")))((("
print (costToBalance(s))
s = "))(("
print (costToBalance(s))
# This code is contributed by # Surendra_Gangwar |
// C# code to calculate the // minimum cost to make the // given parentheses balanced using System;
class GFG
{ static int costToBalance( string s)
{
if (s.Length == 0)
Console.WriteLine(0);
// To store absolute count
// of balanced and unbalanced
// parentheses
int ans = 0;
// o(open bracket) stores count
// of '(' and c(close bracket)
// stores count of ')'
int o = 0, c = 0;
for ( int i = 0; i < s.Length; i++)
{
if (s[i] == '(' )
o++;
if (s[i] == ')' )
c++;
}
if (o != c)
return -1;
int []a = new int [s.Length];
if (s[0] == '(' )
a[0] = 1;
else
a[0] = -1;
if (a[0] < 0)
ans += Math.Abs(a[0]);
for ( int i = 1; i < s.Length; i++)
{
if (s[i] == '(' )
a[i] = a[i - 1] + 1;
else
a[i] = a[i - 1] - 1;
if (a[i] < 0)
ans += Math.Abs(a[i]);
}
return ans;
}
// Driver code
static void Main()
{
string s;
s = ")))(((" ;
Console.WriteLine (costToBalance(s));
s = "))((" ;
Console.WriteLine (costToBalance(s));
}
} // This code is contributed by // Manish Shaw(manishshaw1) |
<script> // javascript code to calculate the // minimum cost to make the // given parentheses balanced function costToBalance( s)
{
if (s.length == 0)
document.write(0);
// To store absolute count
// of balanced and unbalanced
// parentheses
var ans = 0;
// o(open bracket) stores count
// of '(' and c(close bracket)
// stores count of ')'
var o = 0, c = 0;
for ( var i = 0; i < s.length; i++)
{
if (s[i] == '(' )
o++;
if (s[i] == ')' )
c++;
}
if (o != c)
return -1;
var a = new Array(s.Length);
if (s[0] == '(' )
a[0] = 1;
else
a[0] = -1;
if (a[0] < 0)
ans += Math.abs(a[0]);
for ( var i = 1; i < s.length; i++)
{
if (s[i] == '(' )
a[i] = a[i - 1] + 1;
else
a[i] = a[i - 1] - 1;
if (a[i] < 0)
ans += Math.abs(a[i]);
}
return ans;
}
// Driver code
var s;
s = ")))(((" ;
document.write(costToBalance(s) + "<br>" );
s = "))((" ;
document.write(costToBalance(s) + "<br>" );
// This code is contributed by bunnyram19. </script> |
9 4
Complexity Analysis:
- Time Complexity: O(N),N=String Length
- Auxiliary Space: O(N)