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.
The idea in the following program is not normal
public class Solution {
/**
* This is a fundamental problem on implementation of Stack
*
* @param s --the string of parentheses
* @return maximum number of valid parentheses
* @author Averill Zheng
* @version 2014-06-02
* @since JDK 1.7
*/
public int longestValidParentheses(String s) {
int validParen = 0;
Stack<String> paren = new Stack<String>();
paren.push(Integer.toString(0));
int length = s.length();
for(int i = 0; i < length; ++i){
char currentpare = s.charAt(i);
if(currentpare == '(')
paren.push("(");
else{
String topString = paren.pop();
if(topString.equals(")")) //topStirng is ")"
paren.push(")");
//toString is an integer. In this case, the string in the stack maybe
// integer, ( integer ....
else if(!topString.equals("(")){
if(!paren.isEmpty() && paren.peek().equals("(")){
paren.pop();
int tempNumber = Integer.parseInt(topString) + 2;
if(!paren.isEmpty() && !paren.peek().equals("(") && !paren.peek().equals(")"))
tempNumber += Integer.parseInt(paren.pop());
validParen = (validParen < tempNumber) ? tempNumber : validParen;
paren.push(Integer.toString(tempNumber));
}
else //no "(" can matches current ")"
paren.push(")");
}
else{ //topString is "("
int tempNumber = 2;
if(!paren.isEmpty()){
String secondTop = paren.peek();
if(!secondTop.equals("(") && !secondTop.equals(")"))
tempNumber += Integer.parseInt(paren.pop());
}
validParen = (validParen < tempNumber) ? tempNumber : validParen;
paren.push(Integer.toString(tempNumber));
}
}
}
return validParen;
}
}