栈--最长有效括号

作者: 暮想sun | 来源:发表于2020-01-08 10:48 被阅读0次

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
    例:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"
    思路:左括号入栈,遇到右括号。弹出栈顶元素。若栈不为空,表明当前右括号元素匹配成功。当前右括号下标与下一个栈顶元素的差就是最长长度。只要右括号还能遇到栈顶是左括号的元素,表明当前有效长度依然有效。

     public static int longestValidParentheses(String s) {
            //初始化匹配括号数据
            Map<Character, Character> map = new HashMap<>(16);
            map.put(')', '(');
    
            //使用栈进行数据处理,括号匹配.为了计算方便。将-1入栈。在计算有效长度时方便解决数组下标从0开始的问题
            Stack<Integer> stack = new Stack<>();
            stack.push(-1);
            //记录当前元素时的匹配数,如果匹配上,则数据为2,为匹配上数据为0
            int maxValidNum = 0;
            for (int i = 0; i < s.length(); i++) {
                //右括号
                if (map.containsKey(s.charAt(i))) {
    
                    //出栈栈顶元素。为了计算当前下标与下一栈顶元素的差值=当前最长有效长度
                    stack.pop();
                    //栈空,说明碰到了不是左括号的栈顶元素。将当前元素入栈,当前元素没有匹配成功
                    if (stack.isEmpty()) {
                        stack.push(i);
                    } else {
                        maxValidNum = Math.max(maxValidNum, i - stack.peek());
                    }
    
                } else {
                    //左括号,则下标入栈
                    stack.push(i);
                }
            }
            return maxValidNum;
        }
    

    相关文章

      网友评论

        本文标题:栈--最长有效括号

        本文链接:https://www.haomeiwen.com/subject/rshlactx.html