Find maximum depth of nested parenthesis in a string - GeeksforGeeks

25 Mar, 2022
We are given a string having parenthesis like below      “( ((X)) (((Y))) )” We need to find the maximum depth of balanced parenthesis, like 4 in the above example. Since ‘Y’ is surrounded by 4 balanced parentheses. If parenthesis is unbalanced then return -1. 
Examples : 
Input : S = "( a(b) (c) (d(e(f)g)h) I (j(k)l)m)";
Output : 4

Input : S = "( p((q)) ((s)t) )";
Output : 3

Input : S = "";
Output : 0

Input : S = "b) (c) ()";
Output : -1 

Input : S = "(b) ((c) ()"
Output : -1 
Method 1 (Uses Stack) A simple solution is to use a stack that keeps track of current open brackets. 
1) Create a stack. 
2) Traverse the string, do following for every character
     a) If current character is ‘(’ push it to the stack .
     b) If character is ‘)’, pop an element.
     c) Maintain maximum count during the traversal. 
Below is the code implementation of the algorithm.
C++
Java
// A C++ program to find the maximum depth of nested// parenthesis in a given expression#include <bits/stdc++.h>using namespace std; int maxDepth(string& s){    int count = 0;    stack<int> st;     for (int i = 0; i < s.size(); i++) {        if (s[i] == '(')            st.push(i); // pushing the bracket in the stack        else if (s[i] == ')') {            if (count < st.size())                count = st.size();            /*keeping track of the parenthesis and storing            it before removing it when it gets balanced*/            st.pop();        }    }    return count;} // Driver programint main(){    string s = "( ((X)) (((Y))) )";    cout << maxDepth(s);     // This code is contributed by rakeshsahni     return 0;}
/*package whatever //do not write package name here */ import java.io.*;import java.util.*;class GFG {    public static int maxDepth(String s) {        int count=0;        Stack<Integer> st = new Stack<>();                 for(int i=0;i<s.length();i++)        {            if(s.charAt(i) == '(')                st.push(i);//pushing the bracket in the stack            else if(s.charAt(i) == ')')            {                if(count < st.size())                    count = st.size();              /*keeping track of the parenthesis and storing it before removing              it when it gets balanced*/                st.pop();            }        }        return count;}    public static void main (String[] args) {        System.out.println(maxDepth("( ((X)) (((Y))) )"));    }}
4
Time Complexity : O(n) Auxiliary Space : O(n)
Method 2 ( O(1) auxiliary space ) This can also be done without using stack.  
1) Take two variables max and current_max, initialize both of them as 0.
2) Traverse the string, do following for every character
    a) If current character is ‘(’, increment current_max and 
       update max value if required.
    b) If character is ‘)’. Check if current_max is positive or
       not (this condition ensure that parenthesis are balanced). 
       If positive that means we previously had a ‘(’ character 
       so decrement current_max without worry. 
       If not positive then the parenthesis are not balanced. 
       Thus return -1. 
3) If current_max is not 0, then return -1 to ensure that the parenthesis
   are balanced. Else return max
Below is the implementation of the above algorithm.
C++
Java
Python3
C#
PHP
Javascript
// A C++ program to find the maximum depth of nested// parenthesis in a given expression#include <iostream>using namespace std; // function takes a string and returns the// maximum depth nested parenthesisint maxDepth(string S){    int current_max = 0; // current count    int max = 0; // overall maximum count    int n = S.length();     // Traverse the input string    for (int i = 0; i < n; i++)    {        if (S[i] == '(')        {            current_max++;             // update max if required            if (current_max > max)                max = current_max;        }        else if (S[i] == ')')        {            if (current_max > 0)                current_max--;            else                return -1;        }    }     // finally check for unbalanced string    if (current_max != 0)        return -1;     return max;} // Driver programint main(){    string s = "( ((X)) (((Y))) )";    cout << maxDepth(s);    return 0;}
//Java program to find the maximum depth of nested// parenthesis in a given expression class GFG {// function takes a string and returns the// maximum depth nested parenthesis     static int maxDepth(String S) {        int current_max = 0; // current count        int max = 0; // overall maximum count        int n = S.length();         // Traverse the input string        for (int i = 0; i < n; i++) {            if (S.charAt(i) == '(') {                current_max++;                 // update max if required                if (current_max > max) {                    max = current_max;                }            } else if (S.charAt(i) == ')') {                if (current_max > 0) {                    current_max--;                } else {                    return -1;                }            }        }         // finally check for unbalanced string        if (current_max != 0) {            return -1;        }         return max;    } // Driver program    public static void main(String[] args) {        String s = "( ((X)) (((Y))) )";        System.out.println(maxDepth(s));    }}
# A Python program to find the maximum depth of nested# parenthesis in a given expression # function takes a string and returns the# maximum depth nested parenthesisdef maxDepth(S):    current_max = 0    max = 0    n = len(S)     # Traverse the input string    for i in range(n):        if S[i] == '(':            current_max += 1             if current_max > max:                max = current_max        else if S[i] == ')':            if current_max > 0:                current_max -= 1            else:                return -1     # finally check for unbalanced string    if current_max != 0:        return -1     return max # Driver programs = "( ((X)) (((Y))) )"print (maxDepth(s)) # This code is contributed by BHAVYA JAIN
// C# program to find the// maximum depth of nested// parenthesis in a given expressionusing System;class GFG {   // function takes a string// and returns the maximum// depth nested parenthesis static int maxDepth(string S){  // current count  int current_max = 0;     // overall maximum count  int max = 0;     int n = S.Length;   // Traverse the input string  for (int i = 0; i < n; i++)  {    if (S[i] == '(')    {      current_max++;       // update max if required      if (current_max > max)      {        max = current_max;      }    }    else if (S[i] == ')')    {      if (current_max > 0)      {        current_max--;      }      else      {        return -1;      }    }  }   // finally check for unbalanced string  if (current_max != 0)  {    return -1;  }   return max;} // Driver programpublic static void Main(){  string s = "(((X)) (((Y))))";  Console.Write(maxDepth(s));}} // This code is contributed by Chitranayal
<?php// A PHP program to find the// maximum depth of nested// parenthesis in a given// expression // function takes a string // and returns the maximum// depth nested parenthesisfunction maxDepth($S){    // current count    $current_max = 0;         // overall maximum count    $max = 0;    $n = strlen($S);     // Traverse the input string    for ($i = 0; $i < $n; $i++)    {        if ($S[$i] == '(')        {            $current_max++;             // update max if required            if ($current_max> $max)                $max = $current_max;        }                 else if ($S[$i] == ')')        {            if ($current_max>0)                $current_max--;            else                return -1;        }    }     // finally check for    // unbalanced string    if ($current_max != 0)        return -1;     return $max;} // Driver Code$s = "( ((X)) (((Y))) )";echo maxDepth($s); // This code is contributed by mits?>
<script> // Javascript program to find the// maximum depth of nested parenthesis// in a given expression // Function takes a string and returns the// maximum depth nested parenthesisfunction maxDepth(S){         // Current count    let current_max = 0;         // Overall maximum count    let max = 0;    let n = S.length;         // Traverse the input string        for(let i = 0; i < n; i++)    {        if (S[i] == '(')        {            current_max++;                         // Update max if required            if (current_max > max)            {                max = current_max;            }        }        else if (S[i] == ')')        {             if (current_max > 0)             {                current_max--;            } else            {                return -1;            }        }    }         // Finally check for unbalanced string    if (current_max != 0)    {        return -1;    }     return max;} // Driver codelet s = "( ((X)) (((Y))) )"; document.write(maxDepth(s)); // This code is contributed by avanitrachhadiya2155     </script>
4
Time Complexity: O(n) Auxiliary Space: O(1) 
YouTubeGeeksforGeeks502K subscribersFind maximum depth of nested parenthesis in a string | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.More videosMore videosYou're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 5:51•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=IOQi3aJFIaM" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
?list=PLqM7alHXFySF7Lap-wi5qlaD8OEBx9RMV 
This article is contributed by Gaurav Sharma. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 
Mithun Kumar
princiraj1992
AvirupDutta
ukasp
avanitrachhadiya2155
amartyaghoshgfg
surinderdawra388
ritiksahu9312
rakeshsahni
Stack
Strings
Strings
Stack
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for Tower of Hanoi
Inorder Tree Traversal without Recursion
Implement a stack using singly linked list
Implement Stack using Queues
Merge Overlapping Intervals
Reverse a string in Java
Write a program to reverse an array or string
Longest Common Subsequence | DP-4
Write a program to print all permutations of a given string
C++ Data Types