【Leetcode】Longest Valid Parentheses

题目链接: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;
    }

你可能感兴趣的:(LeetCode)