zoukankan      html  css  js  c++  java
  • 32. 最长有效括号

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

    示例 1:

    输入: "(()"
    输出: 2
    解释: 最长有效括号子串为 "()"
    示例 2:

    输入: ")()())"
    输出: 4
    解释: 最长有效括号子串为 "()()"

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-valid-parentheses

    典型的栈结构

    栈中初始化一个 -1,作为分割符;

    遇到'('入栈,遇到')'出栈;

    当栈为空时且当前扫到的是')',把它入栈作为分割符;

    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            if not s:
                return 0
            res=0
            stack=[-1]
            for i in range(len(s)):
                if s[i]=='(':
                    stack.append(i)
                else:
                    stack.pop()
                    if not stack:
                        stack.append(i)
                    else:
                        res=max(res,i-stack[-1])
            return res
    • time:O(N)
    • space:O(N)

    暴力=>优化

     

    先写出暴力

    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            n = len(s)
            res = 0
    
            def Cnt(start):
                cnt = 0
                res = 0
                for i in range(start, n):
                    if s[i] == '(':
                        cnt += 1
                    if s[i] == ')':
                        cnt -= 1
                    if cnt < 0:
                        return i - start
                    if cnt == 0:
                        res = max(res, i - start + 1)
                return res
            for i in range(n):
                res = max(res, Cnt(i))
    
            return res

    同样是计数,我们会想到用两个指针l,r分别记录左右括号的数量 ;如果 r > l ,说明上次可以匹配的括号到当前的括号这一段不能匹配,重置 l 和 r 为 0;如果 r== l, 此时可以匹配,更新res

    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            l=r=res=0
            for i in s:
                if i=='(':
                    l+=1
                else:
                    r+=1
                if l==r:
                    res=max(res,l+r)
                if r>l:
                    l=r=0
    
            #针对((((()这种情况逆序遍历一遍
            l=r=0
            for i in s[::-1]:
                if i=='(':
                    l+=1
                else:
                    r+=1
                if l==r:
                    res=max(res,l+r)
                if r<l:
                    l=r=0 
    
            return res

    dp

     

     (图片来自网络)

    py

    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            res = 0
            dp = [0] * (len(s) + 1)
            for i in range(1, len(s) + 1):
                if s[i - 1] == '(':
                    continue
                left = i - 2 - dp[i - 1]
                if left >= 0 and s[left] == '(':
                    dp[i] = dp[i - 1] + 2
                    if dp[i - dp[i]]:
                        dp[i] += dp[i - dp[i]]  
                    res =max(res,dp[i])
    
            return res

     c++

    class Solution {
    public:
        int longestValidParentheses(string s) {
            int res=0;
            int n=s.size();
            vector<int>dp(n+1);
            for(auto i:dp)i=0;
            for(int i=1;i<=n;i++){
                if(s[i-1]=='(')continue;
                int left=i-2-dp[i-1];
                if(left>=0&&s[left]=='('){
                    dp[i]=dp[i-1]+2;
                    if(dp[i-dp[i]]){
                        dp[i]+=dp[i-dp[i]];
                    }
                    res=max(res,dp[i]);
                }
            }
            return res;
        }
    };

  • 相关阅读:
    填坑!!!virtualenv 中 nginx + uwsgi 部署 django
    树的遍历与递归
    Python 函数的参数
    virtualbox安装增强功能时【未能加载虚拟光盘】
    深入理解Python中的生成器
    Genymotion下载慢或者下载失败的解决办法
    Python3 多线程的两种实现方式
    Java 多线程
    关于"裁员与面试"的个人感悟吧
    三、由简单对象组装复杂实例的模式:建造者模式
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13385564.html
Copyright © 2011-2022 走看看