• [Leetcode] 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.

     题意:找到字符串中,最大的有效括号数

    思路:这题是valid parentheses的扩展,也可以利用栈结构来实现。这里我们用栈存放左括号的下标,遇到左括号,将其下标存入栈中。遇到右括号,若此时栈为空,说明这个不是有效括号对里的,跳过,更新有效括号的起始点;若是栈不为空,则栈顶元素出栈。此时,若栈为空,后面不一定没有接合法的有效括号对,所以,计算当前和有效括号起始点的距离,并更新最大值,如:()();若不为空,用当前位置距离栈顶元素的距离和maxlen中的最大值更新maxlen,如:()(()()。参考了Grandyang的博客。代码如下:

     1 class Solution {
     2 public:
     3     int longestValidParentheses(string s) 
     4     {
     5         stack<int> stk;
     6         int start=0,maxLen=0;
     7         for(int i=0;i<s.size();++i)
     8         {
     9             if(s[i]=='(')
    10                 stk.push(i);
    11             else 
    12             {
    13                 if(stk.empty())
    14                     start=i+1;
    15                 else
    16                 {
    17                     stk.pop();
    18                     if(stk.empty())
    19                         maxLen=max(maxLen,i-start+1);
    20                     else
    21                         maxLen=max(maxLen,i-stk.top());
    22                 }
    23             }
    24         }    
    25         return maxLen;
    26          
    27     }
    28 };

    这题还能使用动态规划的方式解:

    dp[i]为到i处最长的有效括号,如果s[i]为左括号,则dp[i]为0,因为若字符串是以左括号结束,则不可能为有效的;若是为右括号,有两种情况:

    一:其前者s[i-1]为左括号,所以dp[i]=dp[i-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对应对应最长括号的起始点

    LeetCode OJ代码如下:

     1 class Solution {
     2 public:
     3     int longestValidParentheses(string s) 
     4     {
     5         if(s.size()<=1) return 0;
     6         int maxLen=0;
     7         vector<int> dp(s.size(),0);
     8         for(int i=1;i<s.size();++i)
     9         {
    10             if(s[i]==')'&&i-dp[i-1]-1>=0&&s[i-dp[i-1]-1]=='(')
    11             {
    12                 dp[i]=dp[i-1]+2+((i-dp[i-1]-2>=0)?dp[i-dp[i-1]-2]:0);
    13                 maxLen=max(dp[i],maxLen);
    14             }
    15         }
    16         return maxLen;
    17 
    18     }
    19  };
  • 相关阅读:
    Spring的设计理念和整体架构
    垃圾收集器与内存分配策略(3)
    垃圾收集器与内存分配策略(2)
    实践一次有趣的sql优化
    PHP之static
    PHP之const
    MySQL数据库常用操作
    PHP之__aotoload()自动加载机制
    PHP之类的属性方法重写
    MYSQL工具类简单实现
  • 原文地址:https://www.cnblogs.com/love-yh/p/7190810.html
Copyright © 2020-2023  润新知