leetcode 32. Longest Valid Parentheses Python3 解

本文介绍了一种使用栈解决最长有效括号子串问题的方法,并探讨了动态规划和递归的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.问题描述

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

 

Example 1:

Input: s = "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()".

Example 2:

Input: s = ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()".

Example 3:

Input: s = ""
Output: 0

 

Constraints:

  • 0 <= s.length <= 3 * 104
  • s[i] is '(', or ')'.

二.解题思路

1.栈

首先想到的就是栈,遇到'('就进栈,遇到')'就出栈,当栈为空了还想出栈的时候就说明一个合法的括号表达式结束,

这时候记录长度。

一个很巧妙的做法来确定当前有效括号表达式长度而不需要开一个变量来记录的方法就是。

首先分析,为什么我们需要专门有一个变量来记录长度,

因为用栈只能处理一个最小单位的合法括号串,比如()(),栈的处理单位是(),然后在(),为什么会这样?因为按照之前的思路,处理完(),栈就空了,

顺着这个思路,那我们只需要让再处理完第一个()之后,栈非空不就好了。

入栈的时候我们入'('在当前串中的索引,然后让栈顶后面的那个元素记录当前起始合法最长串的起始索引的前一位。

这样子我们在处理完最后一个合法括号的索引时,将当前索引i和之前记录的索引相减就是当前合法括号串的长度。

一个合法的括号串是当前遇到')'弹出后,当前栈非空(因为我们多开了一个位置记录,所以一定是非空的,如果是空的说明不是合法)。

初始stack为 [-1]。

代码:

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        stack,max_len=[-1],0
        for i,v in enumerate(s):
            if v==')':
                if stack:
                    stack.pop()
                if stack:
                    max_len=max(max_len,i-stack[-1])
                    continue
            stack.append(i)
        return max_len

2.动态规划

3.递归

能用栈的就能用递归,括号串是很明显的递归结构,比如'(())'',是很明显有层次结构的。

递归条件: 遇到'('就往下递归。

结束条件: 遇到')'就返回。

返回值:当前子递归的合法串长度。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值