leetcode算法练习【32】最长有效括号

所有题目源代码:Git地址

题目

给定一个只包含 '('')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

方案:看到括号匹配想到Stack

class Solution {
        public int longestValidParentheses(String s) {
            if(s == null || s.length() < 2) return 0 ;
            int ans = 0;
            Stack<Integer> stack = new Stack<>( );
            //为了避免第一次遇到)且stack为0的情况,所以需要插入一个值,-1是因为弥补数组从0开始的特点
            stack.push(-1);
            for (int i = 0; i < s.length( ); i++) {
                if (s.charAt(i) == '(') stack.push(i);
                else if (s.charAt(i) == ')') {
                    if (!stack.isEmpty( )) {
                        stack.pop( );
                        //放入最近一次开始的值
                        if (stack.isEmpty()) stack.push(i);
                        //寻找最大值,刚开始太过注重stack括号匹配的问题,括号的匹配由if控制即可
                        //在)中判断最大值是因为最大值只可能出现在由新的匹配出现的情况,即新的)
                        else ans = Math.max(i-stack.peek(),ans);
                    }
                }
            }
            return ans;
        }
    }
复杂度计算
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

杂记:Stack

/**
         * 结论:peek返回栈顶元素,不弹出,pop弹出
         *      如果栈为空则会报错
         */
        Stack<Character> stack = new Stack<>( );
        stack.push('s');
        System.out.println(stack.peek( ));
        System.out.println(stack.pop( ));
//        System.out.println(stack.peek());
//        System.out.println(stack.pop());
        System.out.println(stack.isEmpty( ));

原创文章 179 获赞 270 访问量 34万+

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/105998087