leetcode32. 最长有效括号-java

题目所属分类

栈的相关例题

原题链接

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

代码案例:输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”

输入:s = “”
输出:0

题解

需要注意的是,如果一开始栈为空,第一个字符为左括号的时候我们会将其放入栈中,这样就不满足提及的「最后一个没有被匹配的右括号的下标」,为了保持统一,我们在一开始的时候往栈中放入一个值为 -1 的元素。
就是记录每个字串的起点前一个位置
leetcode32. 最长有效括号-java_第1张图片
合法括号就是: 左右数量相等
然后左括号数量>=右括号数量
leetcode32. 最长有效括号-java_第2张图片
合法序列不会横跨两条线
反证法证明:
leetcode32. 最长有效括号-java_第3张图片
就是栈里面存放的就是那个分界的右括号的下标

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

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)