zoukankan      html  css  js  c++  java
  • Leetcode#32 Longest Valid Parentheses

    原题地址

    方法I:动态规划

    len[i]表示从i开始到结束的最长合法括号串长度,则:

    如果s[i] == "(" 且 s[i+len[i+1]+1]==")",len[i] = len[i+1] + 2

    否则len[i] = 0

    方法II:辅助栈

    跟那个直方图求最大面积有点类似,用一个栈保存合法括号串的长度,显然长度只能是大于0的偶数(废话),所以可以用0表示"("。

    如果当前元素是"(",将0压栈

    如果当前元素是")",依次查看栈顶元素并弹栈

    如果栈顶元素大于0,说明这是一个合法括号串的长度,那么累加到总长度上

    如果栈顶元素等于0,说明遇到了一个"(",将总长度+2,然后重新压栈,如果有必要,更新最长括号长度

    这样遍历完s以后,栈里面都是一些局部括号串的长度,以及一些0(代表未匹配的"("),然后再做一遍上面的操作即可

    代码:(方法II)

     1 int longestValidParentheses(string s) {
     2   stack<int> st;
     3   int len = 0;
     4   int top = 0;
     5   int maxLen = 0;
     6 
     7   for (int i = 0; i < s.length(); i++) {
     8     if (s[i] == '(')
     9       st.push(0);
    10     else {
    11       len = 0;
    12       while (!st.empty()) {
    13         int top = st.top();
    14         st.pop();
    15         len += top;
    16         if (top == 0) {
    17           len += 2;
    18           st.push(len);
    19           break;
    20         }
    21       }
    22       maxLen = max(maxLen, len);
    23     }
    24   }
    25 
    26   len = 0;
    27   while (!st.empty()) {
    28     top = st.top();
    29     st.pop();
    30     if (top > 0)
    31       len += top;
    32     else {
    33       maxLen = max(maxLen, len);
    34       len = 0;
    35     }
    36   }
    37   maxLen = max(maxLen, len);
    38 
    39   return maxLen;
    40 }
  • 相关阅读:
    Git 实战教程
    Github 快速上手实战教程
    02.制作一个自己的 Java 编辑器
    Eclipse代码自动提示设置
    java.lang.SuppressWarnings的注解简介
    01.Java 开发简单的计算器
    10个相见恨晚的 Java 在线练手项目
    git 1
    cocos3.2 搭建开发环境
    love 音效
  • 原文地址:https://www.cnblogs.com/boring09/p/4243153.html
Copyright © 2011-2022 走看看