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; } }