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

    题目链接:32. Longest Valid Parentheses

    解法一:使用栈,,参考

    这道题的要求是在仅包含“(”和“)”的字符串中,找到最长的括号匹配的子串,返回其长度。

    对于括号匹配,和Valid Parentheses同样的思路,用栈维护左括号,即在读取字符串的时候,遇到左括号就入栈。遇到右括号就出栈,同时判断当前括号匹配的子串是否为最长子串。

    不过在判断括号匹配的子串的长度的时候,有一些值得注意的问题,其中需要借助变量l记录当前括号匹配的子串的左侧位置:

    1. 如果当前栈为空,这说明当前的右括号并不构成括号匹配的子串,则l移到下一位置。
    2. 如果当前栈不为空,弹出栈顶元素。此时,如果栈为空,说明加上当前的右括号可以构成括号匹配的子串,其子串长度就为l位置到当前位置的长度;如果栈不为空,则栈顶元素后面的括号对肯定是匹配的,因此子串长度就为栈顶元素位置的后一位置到当前位置的长度。
     class Solution
     {
     public:
         int longestValidParentheses(string s)
         {
             int res = 0, l = 0;
             stack<int> si;
             for(int i = 0; i < s.size(); ++ i)
             {
                 if(s[i] == '(')
                     si.push(i);
                 else
                 {
                     if(si.empty())
                         l = i + 1;
                     else
                     {
                         si.pop();
                         if(si.empty())
                             res = max(res, i - l + 1);
                         else
                             res = max(res, i - si.top());
                     }
                 }
             }
             return res;
         }
     };

    方法二:递归,参考自

    思路:

    dp[i]表示以当前位置为终点的最长长度,则只能在')'处更新,

    如果s[i-1-dp[i-1]]=='(',则说明当前位置可以和i-1-dp[i-1]位置匹配,dp[i]=dp[i-1]+2;

    然后还要加上匹配位置之前的最长长度dp[i]+=dp[i-dp[i]];

    class Solution {
    public:
        int longestValidParentheses(string s) 
        {
            int result=0;
            s=')'+s;
            vector<int> dp(s.length(),0);
            for(int i=1;i<s.length();i++)
            {
                if(s[i]==')')
                {
                    if(s[i-1-dp[i-1]]=='(') dp[i]=dp[i-1]+2;
                    dp[i]+=dp[i-dp[i]];
                }
                result=max(result,dp[i]);
            }
            return result;
        }
    };
  • 相关阅读:
    CrackMe17
    逆向按钮事件定位
    CrackMe20
    CrackMe14
    CrackMe09
    CrackMe08
    分布式事务seata
    SpringBoot自动注入原理初解与实现
    InnoDB事务日志(redo log 和 undo log)详解
    高频面试题:Spring 如何解决循环依赖?
  • 原文地址:https://www.cnblogs.com/bright-mark/p/9595292.html
Copyright © 2011-2022 走看看