【Leetcode】Longest Valid Parentheses

来源:互联网 发布:接入网络 编辑:程序博客网 时间:2024/06/06 14:08

题目链接:https://leetcode.com/problems/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.

思路:
这题简直太恶心了,,根据http://blog.csdn.net/yeqiuzs/article/details/51622394 很容易想到利用栈来做,所以我压根没想用dp,思路也简单,为了简单起见,用一个数组保存字符串中字符是否是有效字符,用栈判断,最后遍历一遍数组,找到最长的连续的有效字符。。。
为啥说这题ac的时间要求恶心呢,上面这种思路,c++可以ac,java就超时,我在本地测试了一下超时的例子,结果发现能ac的方法和超时的方法运行时间差别很小,只有不到10ms。。= =!
无语,怀疑是两遍遍历时间刚好超了,只好尝试一遍遍历得到结果。

这里用栈只保存左括号的下标,当遇到一个右括号若栈存在左括号,就计算一下有效字符串的长度。

算法:

    public int longestValidParentheses(String s) {        Stack<Integer> stack = new Stack<Integer>();        int lastInvalid = -1, max = 0;        for (int i = 0; i < s.length(); i++) {            char c = s.charAt(i);            if (c == '(') {                stack.push(i);            } else if (c == ')') {                if (stack.isEmpty()) {                    lastInvalid = i;                } else {//形成一组有效括号对                    stack.pop();                    if(stack.isEmpty()){                        max = Math.max(max, i-lastInvalid);                    }else{//若仍有左括号等待配对 则此时它是最近左边的一个失效括号                        max = Math.max(max, i-stack.peek());                    }                }            }        }        return max;    }
0 0
原创粉丝点击