leetcode-32. 最长有效括号 力扣 java版本

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

示例 1:

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


示例 2:

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

package leetcode;

import java.util.Stack;

/**
 * @author 江河
 * @date 2019-10-06 11:02
 * 利用栈记录下标,这样有不符合括号放在栈里,就是以这个为栈底下标。
 * 不符合就一直在底符合一对的就出去了,知道最后一个符合的去减这个底下标
 * 巧妙在于放下标:时间复杂度O(N),空间复杂度O(N)
 */
public class leetcode32 {
  public static void main(String[] args) {
    String s = "()()()";
    int ss = longestValidParentheses(s);
    System.out.println(ss);
  }
  public static int longestValidParentheses(String s) {
    int maxNumber = 0;
    Stack stack = new Stack<>();
    //以-1作为开始下标底便于运算比如;"()"开始长度就是1-(-1)=2
    stack.push(-1);
    for (int i = 0; i < s.length(); i++) {
      //'('下标放栈里
      if (s.charAt(i) == '(') {
        stack.push(i);
      } else {
        //如果不是'('就是')'了,那就配对成功出栈'('的下标
        stack.pop();
        if (stack.empty()) {
          //如果开始第一个就是')'那就把下标保存起来
          stack.push(i);
        } else {
          //比较那个下标大,如果存在连续的中间下标都成对取出来了,而i在增大减去栈中不连续的下标
          maxNumber = Math.max(maxNumber, i - stack.peek());
        }
      }
    }
    return maxNumber;
  }
}

 

你可能感兴趣的:(leetcode)