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.

思路

栈的不是括号,而是括号的下标

  1. 遇到"("无条件入栈
  2. 遇到“)”,如果stack不是空,弹出栈顶的左括号。比如((()
    • 弹出栈顶后,判断stack是否为空,不为空表示有非法括号存在:
      1. 那么最后一个非法的左括号的下标就是栈顶的下标,所以当前的合法括号组合的长度是i - stack.peek()
      2. 弹出栈顶后,如果stack为空,那么表示全部为合法括号对,此时合法括号组合的长度是 i - start
      3. start初始时为-1,但是当 ())(())这种情况出现时,第一队括号已经被消除了,第三个右括号出现时,那么start更新为他的下标。
class Solution {
    public int longestValidParentheses(String s) {
        //入栈的不是括号,而是括号的下标
        // 遇到"(" 无条件入栈
        // 遇到“)”,如果stack不是空,弹出栈顶的左括号。比如((()
            //1. 弹出栈顶后,判断stack是否为空,不为空表示有非法括号存在,
            //那么最后一个非法的左括号的下标就是栈顶的下标,所以当前的合法括号组合的长度是 i - stack.peek()
            //2. 弹出栈顶后,如果stack为空,那么表示全部为合法括号对,此时合法括号组合的长度是 i - start
                // start初始时为-1,但是当 ())(()) 这种情况出现时,第一队括号已经被消除了,第三个右括号出现时,那么start更新为他的下标。
        int maxLen = 0;
        int start = -1;
        Stack stack = new Stack();
        
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            if (cur == '(') {
                stack.push(i);
            } else {
                if (!stack.isEmpty()) {
                    stack.pop();
                    if (!stack.isEmpty()) {
                        maxLen = Math.max(maxLen, i - stack.peek());
                    } else {
                        maxLen = Math.max(maxLen, i - start);
                    }
                } else {
                    start = i;
                }
            }
        }
        return maxLen;

    }
}

你可能感兴趣的:(Longest Valid Parentheses)