leetCode 32.Longest Valid Parentheses (有效的最大括号) 解题思路和方法

原创 2015年07月08日 16:26:06

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.


思路:此题也是参看网上资料解出。我自己做出来的是循环O(n^3)的时间复杂度,提交果断超时。我解法的思想是先判断字符串为奇数还是偶数,偶数就本字符串开始,判断是否为有效括号对,是返回,不是,长度减2,循环截取s,直到找到最大为止。

另一种方法参看了别人的思路,自己写的代码,总体思想是循环遍历S,用两个栈保存,一个保存“()”,一个保存索引,两个栈的操作相同。最后未出栈的元素就是无法匹配的元素,同时也是各个有效括号组的分界点,据此由各个索引相减求最大值即可。

同一个复杂字符串,方法一耗时1790ms,方法二耗时1ms.效率差距巨大。

方法一代码:

	    public int longestValidParentheses(String s) {
	        int len = s.length();
	        if(len <= 1){
	            return 0;
	        }
	        int startLen;
	        int validLen = 0;
	        //长度为偶数
	        if((len & 1) == 0){
	            startLen = len;
	        }else{
	            startLen = len -1;
	        }
	        boolean isBreak = false;
	        while(startLen > 0){
	        	if(isBreak) break;
	            for(int i = 0; i + startLen <= len; i++){
	                String temp = s.substring(i,i+startLen);
	                int k = lenValid(temp);
	                if(k > validLen){
	                    validLen = k;
	                    isBreak = true;
	                    break;
	                }
	            }
	            startLen -= 2;
	        }
	        return validLen;
	    }
	    //str是否有效括号,有效返回len,无效返回-1
	    private int lenValid(String str){
	        Stack<Character> st = new Stack<Character>();
	        for(int i = 0; i< str.length();i++){
	            if(st.isEmpty() || st.peek() != '(' || str.charAt(i) != ')'){
	                st.push(str.charAt(i));
	            }else{
	                st.pop();
	            }
	        }
	        if(st.isEmpty()){
	            return str.length();
	        }
	        return -1;
	    }
方法二代码:

    public int longestValidParentheses1(String s) {
        Stack<Character> st = new Stack<Character>();//保存()
        Stack<Integer> si = new Stack<Integer>();//保存()的索引
        si.push(-1);//将-1作为一个分界起始值
        for(int i = 0; i < s.length(); i++){
            if(st.isEmpty() || st.peek() != '(' || s.charAt(i) != ')'){
                st.push(s.charAt(i));//入栈
                si.push(i);
            }else{
                st.pop();//出栈
                si.pop();
            }
        }
        //si.push(s.length()-1);
        //每一个未出栈的元素都是各个有效组的分界点
        int end = s.length();//起始点
        int max = 0;//最大长度
        while(!si.isEmpty()){
            int start = si.pop();
            max = end - start - 1 > max ? end - start -1:max;
            end = start;
        }
        return max;
    }



版权声明:本文为博主原创文章,未经博主允许不得转载。

[leetcode] 20. Valid Parentheses 解题报告

题目链接:https://leetcode.com/problems/valid-parentheses/ Given a string containing just the character...
  • qq508618087
  • qq508618087
  • 2015年12月20日 18:05
  • 354

leetCode 22.Generate Parentheses (生成括号) 解题思路和方法

Generate Parentheses  Given n pairs of parentheses, write a function to generate all combinatio...
  • xygy8860
  • xygy8860
  • 2015年07月06日 22:11
  • 747

LeetCode 20 Valid Parentheses (C,C++,Java,Python)

Problem: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', deter...
  • runningtortoises
  • runningtortoises
  • 2015年05月10日 16:41
  • 2672

LeetCode(20) Valid Parentheses

题目如下 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the...
  • feliciafay
  • feliciafay
  • 2013年12月19日 06:04
  • 2893

leetCode 20.Valid Parentheses (有效的括号) 解题思路和方法

Valid Parentheses  Given a string containing just the characters '(', ')', '{', '}', '[' and ']', d...
  • xygy8860
  • xygy8860
  • 2015年07月06日 17:21
  • 487

[LeetCode]Valid Parentheses

题目要求如下: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determ...
  • zhouworld16
  • zhouworld16
  • 2013年12月28日 11:45
  • 8714

LeetCode(32)Longest Valid Parentheses

题目如下: Given a string containing just the characters '(' and ')', find the length of the longest vali...
  • feliciafay
  • feliciafay
  • 2014年03月07日 08:31
  • 1753

C实现 LeetCode->Valid Parentheses

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu...
  • liutianshx2012
  • liutianshx2012
  • 2015年06月17日 09:51
  • 534

Valid Parentheses python题解

Valid Parentheses python题解
  • xiaolewennofollow
  • xiaolewennofollow
  • 2015年04月20日 12:31
  • 997

leetcode - 32.Longest Valid Parentheses

Longest Valid Parentheses
  • qq_27350929
  • qq_27350929
  • 2017年03月02日 19:56
  • 50
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetCode 32.Longest Valid Parentheses (有效的最大括号) 解题思路和方法
举报原因:
原因补充:

(最多只允许输入30个字)