Length of longest balanced parentheses prefix
Given a string of open bracket ‘(‘ and closed bracket ‘)’. The task is to find the length of longest balanced prefix.
Examples:
Input : S = "((()())())(("
Output : 10
From index 0 to index 9, they are forming
a balanced parentheses prefix.
Input : S = "()(())((()"
Output : 6
The idea is take value of open bracket ‘(‘ as 1 and value of close bracket ‘)’ as -1. Now start finding the prefix sum of the given string. The farthest index, say maxi, where the value of sum is 0 is the index upto which longest balanced prefix exists. So the answer would be maxi + 1.
Below is the implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
int maxbalancedprefix( char str[], int n)
{
int sum = 0;
int maxi = 0;
for ( int i = 0; i < n; i++) {
if (str[i] == '(' )
sum += 1;
else
sum -= 1;
if (sum < 0)
break ;
if (sum == 0)
maxi = i + 1;
}
return maxi;
}
int main()
{
char str[] = "((()())())((" ;
int n = strlen (str);
cout << maxbalancedprefix(str, n) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int maxbalancedprefix(String str, int n)
{
int sum = 0 ;
int maxi = 0 ;
for ( int i = 0 ; i < n; i++) {
if (str.charAt(i) == '(' )
sum += 1 ;
else
sum -= 1 ;
if (sum < 0 )
break ;
if (sum == 0 )
maxi = i + 1 ;
}
return maxi;
}
public static void main(String[] args)
{
String str = "((()())())((" ;
int n = str.length();
System.out.println(maxbalancedprefix(str, n));
}
}
|
Python3
def maxbalancedprefix ( str , n):
_sum = 0
maxi = 0
for i in range (n):
if str [i] = = '(' :
_sum + = 1
else :
_sum - = 1
if _sum < 0 :
break
if _sum = = 0 :
maxi = i + 1
return maxi
str = '((()())())(('
n = len ( str )
print (maxbalancedprefix ( str , n))
|
C#
using System;
class GFG {
static int maxbalancedprefix( string str, int n)
{
int sum = 0;
int maxi = 0;
for ( int i = 0; i < n; i++) {
if (str[i] == '(' )
sum += 1;
else
sum -= 1;
if (sum < 0)
break ;
if (sum == 0)
maxi = i + 1;
}
return maxi;
}
public static void Main()
{
string str = "((()())())((" ;
int n = str.Length;
Console.WriteLine(maxbalancedprefix(str, n));
}
}
|
Javascript
<script>
function maxbalancedprefix( str, n)
{
var sum = 0;
var maxi = 0;
for ( var i = 0; i < n; i++) {
if (str[i] == '(' )
sum += 1;
else
sum -= 1;
if (sum < 0)
break ;
if (sum == 0)
maxi = i + 1;
}
return maxi;
}
var str = "((()())())((" ;
var n = str.length;
document.write( maxbalancedprefix(str, n));
</script>
|
PHP
<?php
function maxbalancedprefix( $str , $n )
{
$sum = 0;
$maxi = 0;
for ( $i = 0; $i < $n ; $i ++) {
if ( $str [ $i ] == '(' )
$sum += 1;
else
$sum -= 1;
if ( $sum < 0)
break ;
if ( $sum == 0)
$maxi = $i +1;
}
return $maxi ;
}
$str = array ( '(' , '(' , '(' , ')' , '(' , ')' , ')' , '(' , ')' , ')' , '(' , '(' );
$n = count ( $str );
echo maxbalancedprefix( $str , $n );
?>
|
Time complexity: O(length(str))
Auxiliary space: O(1)
Another Approach:
Initialize two variables, balance and max_len, to zero.
Traverse the string from left to right:
a. If the current character is ‘(‘, increment the balance variable, else decrement it.
b. If the balance variable is negative, reset it to zero and move the max_len pointer to the right.
c. If the balance variable is zero, update the max_len if the current substring length is greater than max_len.
Return max_len.
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
string str = "(()))())" ;
int n = str.length();
int balance = 0;
int max_len = 0;
for ( int i = 0; i < n; i++) {
if (str[i] == '(' ) {
balance++;
} else {
balance--;
}
if (balance < 0) {
balance = 0;
max_len = i + 1;
} else if (balance == 0) {
max_len = i + 1 > max_len ? i + 1 : max_len;
}
}
cout << "Length of longest balanced parentheses prefix is: " << max_len <<endl;
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "(()))())" ;
int n = strlen (str);
int balance = 0;
int max_len = 0;
for ( int i = 0; i < n; i++) {
if (str[i] == '(' ) {
balance++;
} else {
balance--;
}
if (balance < 0) {
balance = 0;
max_len = i + 1;
} else if (balance == 0) {
max_len = i + 1 > max_len ? i + 1 : max_len;
}
}
printf ( "Length of longest balanced parentheses prefix is: %d\n" , max_len);
return 0;
}
|
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
String str = "(()))())" ;
int n = str.length();
int balance = 0 ;
int max_len = 0 ;
for ( int i = 0 ; i < n; i++) {
if (str.charAt(i) == '(' ) {
balance++;
} else {
balance--;
}
if (balance < 0 ) {
balance = 0 ;
max_len = i + 1 ;
} else if (balance == 0 ) {
max_len = i + 1 > max_len ? i + 1 : max_len;
}
}
System.out.println( "Length of longest balanced parentheses prefix is: " + max_len);
}
}
|
Python3
str = "(()))())"
n = len ( str )
balance = 0
max_len = 0
for i in range (n):
if str [i] = = '(' :
balance + = 1
else :
balance - = 1
if balance < 0 :
balance = 0
max_len = i + 1
elif balance = = 0 :
max_len = max (i + 1 , max_len)
print ( "Length of longest balanced parentheses prefix is:" , max_len)
|
C#
using System;
class Program
{
static void Main( string [] args)
{
string str = "(()))())" ;
int n = str.Length;
int balance = 0;
int max_len = 0;
for ( int i = 0; i < n; i++)
{
if (str[i] == '(' )
{
balance++;
}
else
{
balance--;
}
if (balance < 0)
{
balance = 0;
max_len = i + 1;
}
else if (balance == 0)
{
max_len = i + 1 > max_len ? i + 1 : max_len;
}
}
Console.WriteLine( "Length of longest balanced parentheses prefix is: " + max_len);
}
}
|
Javascript
let str = "(()))())" ;
let n = str.length;
let balance = 0;
let max_len = 0;
for (let i = 0; i < n; i++) {
if (str[i] === '(' ) {
balance++;
} else {
balance--;
}
if (balance < 0) {
balance = 0;
max_len = i + 1;
} else if (balance === 0) {
max_len = i + 1 > max_len ? i + 1 : max_len;
}
}
console.log( "Length of longest balanced parentheses prefix is: " + max_len);
|
Output
Length of longest balanced parentheses prefix is: 8
time complexity of O(n), where n is the length of the string
space complexity of O(1)
Last Updated :
19 Oct, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...