leetcode#32

每日leetcode

Posted by Cfeng on September 17, 2019

最长有效括号

题目描述

给定一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

思路

用栈来做,将左括号的下标存储到栈中
当遇到右括号时判断,如果当前栈为空,则修改开头结点坐标
如果非空,弹出栈顶,再次判断栈是否为空,若为空,则比较开头结点到当前坐标长度是否是最大值
若非空,比较当前栈顶元素到当前结点到距离

Java实现

public int longestValidParentheses(String s) {
    Stack<Integer> stack = new Stack<Integer>();
    int ans=0;
    int start=0;
    for(int i=0;i<s.length();i++){
        if(s.charAt(i)=='('){
            stack.push(i);
        }else{
            if (stack.isEmpty()){
                start=i+1;
                continue;
            }
            else{
                stack.pop();
                if(stack.isEmpty()){
                    ans=Math.max(ans,i-start+1);
                }
                else{
                    ans=Math.max(ans,i-stack.peek());
                }
            }
        }
    }
    return ans;
}

执行用时 :16 ms, 在所有 Java 提交中击败了29.59%的用户
内存消耗 :37.1 MB, 在所有 Java 提交中击败了84.71%的用户