"()" 专题: 动态优化, ...">
美文网首页Leetcode刷题
32. Longest Valid Parentheses

32. Longest Valid Parentheses

作者: 兔普战士 | 来源:发表于2020-03-10 22:37 被阅读0次

    题目概括:

    给定一个只有括号的字符串,找到最长的有效括号。
    例如: "(()" -> "()"

    专题: 动态优化, 栈

    • 栈的解法: 时间O(n), 空间O(n)

    废话不多说,先上使用栈的解法

    public int longestValidParentheses(String s) {
      int maxlen = 0;
      Stack<Integer> stack = new Stack<>();
      stack.push(-1);
      for(int i = 0; i < s.length(); i++) {
          if(s.charAt(i) == '(') {
            stack.push(i);
          }else {
            stack.pop();
            if (stack.isEmpty()) {
                stack.push(i);
            }else {
                maxlen = Math.max(maxlen, i - stack.peek());
                    }
            }
          }
           return maxlen;
    }
    

    这个解法的思路: 维持一个栈,栈中存放字符的坐标。遇到'('就推进,反之就pop出。若pop()以后,栈空了。说明目前遇到的')'比'('多一个。此时放入当前坐标(相当于锚定的作用,所以栈在初始化后,就要放入一个-1). 若pop()以后,栈不空,则可以计算当前发现的valid string 长度。

    • 动态优化的解法:时间O(n), 空间O(n)
    public int longestValidParentheses(String s) {
        int maxans =0 ;  
        int dp[] = new int[s.length()];
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == ')') {
                if (s.charAt(i - 1) == '(') {
                    dp[i] = (i >= 2 ? dp[i-2] : 0) + 2;
                }else if (i - dp[i -1] > 0 && s.charAt(i - dp[i-1] - 1) == '(') {
                    dp[i] = dp[i-1] + ((i - dp[i-1]) >= 2 ? dp[i - dp[i-1] - 2] : 0) + 2;
                  }
                maxans = Math.max(maxana,  dp[i]);
              }
    }
      return maxans;
    }
    

    分成两种情况:

    1. s[i] = ')' and s[i-1] = '(': 形如: "...........()"
      dp[i] = dp[i-2] + 2;
    2. s[i] = ')' and s[i-1] = ')' and s[i- dp[i-1] - 1] = '(' : 形如: "............))"
      dp[i] = dp[i-1] + dp[i - dp[i-1] - 2] + 2

    相关文章

      网友评论

        本文标题:32. Longest Valid Parentheses

        本文链接:https://www.haomeiwen.com/subject/tbvndhtx.html