Given : A string containing ‘(’ and ‘)’ characters.
Objective : To find the length of the longest valid parentheses substring.
Example :
1. In the string " ( ( ) ( " the longest valid parentheses substring is " ( ( ) ( " of length 2.
2. In the string " ( ) ( ) ( ( ) ( " the longest valid parentheses substring is " ( ) ( ) ( ( ) ( " of length 4.
Algorithm
Idea is to use a stack to find the length of the longest valid parentheses. As we traverse the string from the beginning till the end, we do the following
Note: Before we begin running the algorithm, we push a -1 onto the stack.
Consider the below Example 1: string : ( )
| Stack | Character | Index | Operation | Length |
|---|---|---|---|---|
| -1 ( Initial value at stack top before run ) | 0 | |||
| -1 | ( | 0 | Push 0 onto stack | 0 |
| 0 -1 | ) | 1 | Pop 0 from the stack & calculate the max length | Max length = 1 - ( - 1 ) = 2 |
Example 2: string : ( ( ) )
| Stack | Character | Index | Operation | Length |
|---|---|---|---|---|
| -1 ( Initial value at stack top before run ) | 0 | |||
| -1 | ( | 0 | Push 0 onto stack | 0 |
| 0 -1 | ( | 1 | Push 1 onto stack 1 | 0 |
| 1 0 -1 | ) | 2 | Pop 1 from the stack & calculate the max length | 2 - ( 0 ) = 2 |
| 0 -1 | ) | 3 | Pop 0 from the stack & calculate the max length | Max length = 3 - ( -1 ) = 4 |
Program to find the longest valid parentheses substring using stack
#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
int Length_LongestValid_Parentheses (string str) {
stack<int> stk;
stk.push(-1);
int maxlen = 0;
for (int index=0; index < str.size(); index++) {
if (str.at(index) == '(') {
stk.push(index);
} else if (str.at(index) == ')') {
stk.pop();
if (stk.empty()) {
stk.push(index);
} else {
if (maxlen < index - stk.top()) {
maxlen = index - stk.top();
}
}
}
}
return maxlen;
}
int main() {
vector<string> vec = {"((()", "()()()", "()(()", "))())", "(", "(((())))()(()()()"};
for (const auto& str : vec) {
cout << "String : " << str << endl;
cout << "Length of longest valid parantheses : " << Length_LongestValid_Parentheses(str) << endl << endl;
}
return 0;
}
Output
String : ((()
Length of longest valid parantheses : 2
String : ()()()
Length of longest valid parantheses : 6
String : ()(()
Length of longest valid parantheses : 2
String : ))())
Length of longest valid parantheses : 2
String : (
Length of longest valid parantheses : 0
String : (((())))()(()()()
Length of longest valid parantheses : 10
from collections import deque
def Length_LongestValid_Parentheses (string) -> int:
stack = deque()
stack.appendleft(-1)
maxlen = 0
for index in range(len(string)) :
if (string[index] == '(') :
stack.appendleft(index)
elif (string[index] == ')') :
stack.popleft()
if (len(stack) == 0) : # If stack is empty, just push the current index
stack.appendleft(index)
else : # If stack is not empty, calculate the max valid parenthesis length
if (maxlen < index - stack[0]) :
maxlen = index - stack[0]
return maxlen
def main() :
parantheseslist = ["()()()", "", "((()", "()(()", "))())", "()", "(((())))()(()()()", "(", ")"]
for p in parantheseslist :
print("String : " + p)
print("Length of longest valid parantheses : " + str(Length_LongestValid_Parentheses(p)) + "\n")
if __name__ == "__main__" :
main()
Output
String : ()()()
Length of longest valid parantheses : 6
String :
Length of longest valid parantheses : 0
String : ((()
Length of longest valid parantheses : 2
String : ()(()
Length of longest valid parantheses : 2
String : ))())
Length of longest valid parantheses : 2
String : ()
Length of longest valid parantheses : 2
String : (((())))()(()()()
Length of longest valid parantheses : 10
String : (
Length of longest valid parantheses : 0
String : )
Length of longest valid parantheses : 0
import java.util.Arrays;
import java.util.List;
import java.util.Stack;
class Parentheses {
int Longest_Valid_Parentheses (String str) {
Stack<Integer> stk = new Stack<Integer>();
int maxlen = 0;
stk.push(-1);
for (int index=0; index < str.length(); index++) {
if (str.charAt(index) == '(') {
stk.push(index);
} else if (str.charAt(index) == ')') {
stk.pop();
if (stk.isEmpty()) {
stk.push(index);
} else {
if (maxlen < index - stk.peek()) {
maxlen = index - stk.peek();
}
}
}
}
return maxlen;
}
public static void main (String args[]) {
List<String> parentheses_strings = Arrays.asList( "((()", "()(()", "))())", "()()()", "", "()", "(((())))()(()()()", "(", ")" );
Parentheses p = new Parentheses();
for (String str : parentheses_strings) {
System.out.println("\nString : " + str);
System.out.println("Length of longest valid parentheses : " + p.Longest_Valid_Parentheses(str));
}
}
}
Output
String : ((()
Length of longest valid parentheses : 2
String : ()(()
Length of longest valid parentheses : 2
String : ))())
Length of longest valid parentheses : 2
String : ()()()
Length of longest valid parentheses : 6
String :
Length of longest valid parentheses : 0
String : ()
Length of longest valid parentheses : 2
String : (((())))()(()()()
Length of longest valid parentheses : 10
String : (
Length of longest valid parentheses : 0
String : )
Length of longest valid parentheses : 0
© 2019-2026 Algotree.org | All rights reserved.
This content is provided for educational purposes. Feel free to learn, practice, and share knowledge.
For questions or contributions, visit algotree.org
"Without requirements or design, programming is the art of adding bugs to an empty text file. - Louis Srygley"