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

    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.

    分析

    brute force

    写一个判断字符串 s 是否是有效括号对的函数,然后遍历所有的字符子串,并验证,找出最长的。
    时间复杂度: 遍历所有子串,O(n2),验证O(n),总的复杂度O(n3)
    空间复杂度:O(n)的stack大小

    DP

    维护一个一位数组dp,dp[i] 代表以s[i]作为结尾的最长有效括号对长度。
    当s[i] == '(',dp[i] 一定是0
    当s[i] == ')':
        1. s[i-1] == '(',即在尾部出现了‘()’,则dp[i] = dp[i-2] + 2
        2. s[i-1] == ')',即在尾部出现了‘))’
        如果 s[i-dp[i-1]-1] == '(',那么 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2],这里需要把由位置 i-dp[i-1]-1 的‘(’隔断的括号对连上,一起计算。

    时间复杂度 O(n),扫描一次字符串
    空间复杂度 O(n),填充长度为s.size()的一维数组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class Solution {
    public:
        int longestValidParentheses(string s) {
            int len = s.size();
            vector<int> dp(len,0);
            int max = 0;
             
            for(int i = 1; i < len; ++i){
               if(s[i] == ')'){
                   if(s[i-1] == '('){
                       dp[i] = (i>=2? dp[i-2]:0) + 2;
                   }
                   else{
                       if(i - dp[i-1] - 1>=0 && s[i - dp[i-1] - 1] == '('){
                           dp[i] = dp[i-1] + 2 + ((i - dp[i-1] - 2) > 0?dp[i - dp[i-1] - 2]: 0);
                       }
                   }//--end of else
               }//--end of if
               max = max < dp[i]? dp[i]: max;
            }//--end of for
             
            return max;
        }
    };





  • 相关阅读:
    serialVersionUID作用
    为什么要使用SLF4J而不是Log4J
    认识Log4j
    Java解析xml文件四种方式
    数据结构之R进制转换
    栈的压入、弹出序列
    中间件学习之RMI+JDBC远端数据库的访问
    Linux程序设计综合训练之简易Web服务器
    Html5笔记之小结
    PhoneGap + Dreamweaver 5.5 无法在模拟器中打开的问题
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/15d8ea4859752b1464fbfe2419856ae6.html
Copyright © 2011-2022 走看看