Leetcode--Java--32. 最长有效括号

题目描述

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

样例描述

示例 1:

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

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:

输入:s = ""
输出:0

思路

技巧性 + 背过即可
合法的括号序列满足两个性质:
Leetcode--Java--32. 最长有效括号_第1张图片

  1. 根据第二个性质,找到不合法的第一个位置,作为分割
    Leetcode--Java--32. 最长有效括号_第2张图片
  2. 对于分割出的每段,再判断这段里面的最长有效长度,首先最后一个作为分割,肯定是没法匹配的。
  3. 对每段里面的每个右括号的位置,枚举以这个右括号结尾的左括号的位置,求一个长度,更新所有的取一个max就是最后的结果。

代码

class Solution {
    public int longestValidParentheses(String s) {
        int n = s.length();
        Deque<Integer> stack = new LinkedList<>();
        stack.push(-1);
        char ch[] = s.toCharArray();
        int res = 0;
        for (int i = 0; i < n; i ++ ) {
            if (ch[i] == '(') {
                stack.push(i);
            } else {
              stack.pop();
              //保证栈顶存储的是最后一个还没匹配的右括号的位置
              if (stack.isEmpty()) {
                  stack.push(i);
              } else {
                  //当前位置减去
                  res = Math.max(res, i - stack.peek());
              }
            }
        }
        return res;
    }
}

你可能感兴趣的:(Leetcode,栈,技巧性)