• leetcode--Longest Valid Parentheses


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

      

  • 相关阅读:
    运算符的方向--好神奇
    a++ 和 ++a ;
    c语言中!和~的区别
    函数的参数,参数为数组
    反射的理解
    ThreadLocal类
    多线程面试题-sleep()和wait()区别
    话题1-关键字
    实现多线程的另一种方式-Callable
    线程池
  • 原文地址:https://www.cnblogs.com/averillzheng/p/3767451.html
Copyright © 2020-2023  润新知