Given a string containing just the characters '('
and ')'
,
find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
,
which has length = 2.
Another example is ")()())"
, where the longest valid
parentheses substring is "()()"
, which has length =
4.
* A Valid Parentheses pair contain only one left and right bracket.
* 1. store index of '(' in the stack
* 2. check stack whether is empty when ')' was found:
* two case as following:
* 2.1 stack is not empty-> a valid pair was matched
* two more case as follow that check whether stack is empty or not
* 2.1.1: stack is empty -> calculate maxLength=Math.max(maxLength, i-lastIndex);
* 2.1.2 stack is not empty-> maxLength=Math.max(maxLength,i-stack.peek());
* 2.2 stack is empty -> not pair matched, updated lastIndex(last index of impartial ')' bracket)
public class Solution {
public int longestValidParentheses(String s) {
if(s.isEmpty()) return 0;
Stack<Integer> stack=new Stack<Integer>();
int maxLength=0;
int lastIndex=-1;
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
//find left bracket,
if(c=='('){
stack.push(i);
}else{
if(c==')'){
if(!stack.isEmpty()){
stack.pop();
if(stack.isEmpty()){ //The entire valid pair group was found;
//and calculate length of pair group
maxLength=Math.max(maxLength, i-lastIndex);
}else{
//There is more '(' left in stack
//update maxLength with counting number of pair so far
maxLength=Math.max(maxLength, i-stack.peek());
}
}else{
// last index of impartial ')' bracket
lastIndex=i;
}
}
}
}
return maxLength;
}
}