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

    这道题我还是没思路,看了别人的做法觉得豁然开朗简单明了!!!!

    栈:

    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            if not s:
                return 0
            res=[]
            stack=[]
            for i in range(len(s)):
                if stack and s[i]==')':
                    res.append(stack.pop())
                    res.append(i)
                if s[i]=='(':
                    stack.append(i)
            res.sort()
            i=0
            ans=0
            n=len(res)
            while i<n:
                j=i
                while j+1<n and res[j+1]==res[j]+1:
                    j+=1
                ans=max(ans,j-i+1)
                i=j+1
            return ans
    执行用时 :88 ms, 在所有 python3 提交中击败了26.32%的用户
    内存消耗 :14.5 MB, 在所有 python3 提交中击败了8.33%的用户
     
    方法2:
    动态规划:
    题解讲得真清晰:
    class Solution:
        def longestValidParentheses(self, s: str) -> int:
            n=len(s)
            if n==0:return 0
            dp=[0]*n
            res=0
            for i in range(n):
                if i>0 and s[i]==')':
                    if s[i-1]=='(':
                        dp[i]=dp[i-2]+2
                    elif s[i-1]==')' and i-dp[i-1]-1>=0 and s[i-dp[i-1]-1]=='(':
                        dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2]
                    if dp[i]>res:
                        res=dp[i]
            return res    
    执行用时 :48 ms, 在所有 python3 提交中击败了98.93%的用户
    内存消耗 :13.8 MB, 在所有 python3 提交中击败了46.97%的用户
     
                                                                                        ——2019.10.17
     

    public int longestValidParentheses(String s) {
            //用栈
            Stack<Integer> stack = new Stack<>();
            if(s.equals("")){
                return 0;
            }
            char[] c = s.toCharArray();
            int len = c.length;
            int max_len = 0;
            int last = -1;  //last代表最后一个‘)’的下标
            for(int i = 0;i<len;i++){
                if(c[i] == '('){
                    stack.push(i);
                }else{
                    if(stack.isEmpty()){
                        last = i;
                    }else{
                        stack.pop();
                        if(stack.isEmpty()){
                            max_len = Math.max(max_len,i-last);
                        }else{
                            max_len = Math.max(max_len,i-stack.peek());
                        }
                    }
                }
            }
            return max_len;
        }

     ——2020.7.14

     
     
    我的前方是万里征途,星辰大海!!
  • 相关阅读:
    Redis的常用命令及数据类型
    Redis介绍与安装
    Docker
    Linux Shell——正则表达式
    Linux Shell 基础
    python常见报错
    CMDB
    python学习
    Python 3.x标准模块库目录
    Python笔记——Django路由系统
  • 原文地址:https://www.cnblogs.com/taoyuxin/p/11690621.html
Copyright © 2011-2022 走看看