一.问题描述
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.递归
能用栈的就能用递归,括号串是很明显的递归结构,比如'(())'',是很明显有层次结构的。
递归条件: 遇到'('就往下递归。
结束条件: 遇到')'就返回。
返回值:当前子递归的合法串长度。