zoukankan      html  css  js  c++  java
  • Longest Valid Parentheses 解答

    Question

    Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

    For "(()", the longest valid parentheses substring is "()", which has length = 2.

    Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.

    Solution 1 -- Stack

    Parenthese类的题目,第一反应是用栈。遇到'('入栈,遇到')'出栈。这题关键在于怎样知道当前的valid parenthese length。

    我们用一个变量start来表示当前的第一个'(' 。

    (  (  (  )  )  )  )  )  (

     start                                                             start

    当栈为空时,进来的第一个左括号的位置为当前的start值。

    出栈操作后:

    1. 如果栈为空,说明从start开始的括号都匹配了。因此长度为 current - start + 1

    2. 如果栈不为空,我们知道弹出栈的一定是都已经匹配了的。因此长度为 current - stack.peek()

    因为只扫描了一遍原数组,所以时间复杂度是O(n),空间复杂度是O(n)

     1 public class Solution {
     2     public int longestValidParentheses(String s) {
     3         if (s == null || s.length() < 1) {
     4             return 0;
     5         }
     6         int length = s.length();
     7         Deque<Integer> stack = new LinkedList<Integer>();
     8         int start = 0;
     9         int result = 0;
    10         for (int i = 0; i < length; i++) {
    11             char current = s.charAt(i);
    12             if (current == '(') {
    13                 stack.push(i);
    14             } else {
    15                 if (stack.isEmpty()) {
    16                     start = i + 1;
    17                 } else {
    18                     stack.pop();
    19                     result = stack.isEmpty() ? Math.max(result, i - start + 1) : Math.max(result, i - stack.peek());
    20                 }
    21             }
    22         }
    23         return result;        
    24     }
    25 }

    Solution 2 -- DP

  • 相关阅读:
    算法导论--第七章、快速排序
    PS操作
    【字符编码】彻底理解字符编码
    HTML网页设计-代码效果记录
    Ubuntu 18.04 nvidia driver 390.48 安装 TensorFlow 1.12.0 和 PyTorch 1.0.0 详细教程
    cmake更新版本简记
    计算机图形学(二)——微表面模型
    计算机图形学(一)——辐照度学概述
    蒙特卡洛积分与重要性采样详解
    for循环提高内存访问效率的做法
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4935002.html
Copyright © 2011-2022 走看看