数据结构与算法

栈--最长有效括号

2020-01-08  本文已影响0人  暮想sun

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
例:输入: ")()())" 输出: 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;
    }
上一篇 下一篇

猜你喜欢

热点阅读