其他分享
首页 > 其他分享> > LeetCode32. 最长有效括号

LeetCode32. 最长有效括号

作者:互联网

LeetCode32. 最长有效括号

题目描述

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

思路分析

  1. 基于栈的先进后出特性,可以巧妙的解决左右括号匹配的问题
  2. 即左括号先入栈,然后拿右括号来匹配,如果匹配成功,则左括号出栈
  3. 此题目难点在于连续,要保证包含左右括号的字符串格式正确且连续,需要转换一种思路,即在栈底始终存放一个没有与左括号匹配的右括号的索引,初始假定索引为-1,在遍历字符串的时候,如果有右括号没有与之对应的左括号,则将该右括号的索引存入栈底,开始下一个连续子串的长度计算
  4. 详解见下

源码及分析

public int longestValidParentheses(String s) {
        //数据校验
        int len = s.length();
        if (s == null || len < 2) {
            return 0;
        }
        //定义count保存子串的长度
        int count = 0;
        //定义栈保存括号
        Stack<Integer> stack = new Stack<>();
        //栈底存放没有被匹配的右括号的索引,栈中维护一个左括号的索引
        stack.push(-1);
        for (int i = 0; i < len; i++) {
            //如果是左括号,直接入栈
            if (s.charAt(i) == '(') {
                stack.push(i);
                //如果是右括号
            } else {
                //先弹出栈顶的元素,即左括号与当前右括号进行匹配
                stack.pop();
                //匹配成功后如果栈不为空,则说明子串连续,记录长度,即用当前位置元素索引 - 栈顶左括号的索引
                if (!stack.isEmpty()) {
                    count = Math.max(count, i - stack.peek());
                } else {
                    //出栈一个元素后如果栈为空,说明出栈的是 -1,即栈中没有左括号和当前右括号匹配,即不连续,
                    // 将当前右括号的索引入栈,保证栈底始终维护的是没有匹配的右括号的索引
                    stack.push(i);
                }
            }
        }
        return count;
    }

标签:count,匹配,索引,stack,括号,栈底,LeetCode32,最长
来源: https://www.cnblogs.com/mx-info/p/14798328.html