一、题目描述:
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
-
示例 1:
- 输入:s = “(()”
- 输出:2
- 解释:最长有效括号子串是 “()”
-
示例 2:
- 输入:s = “)()())”
- 输出:4
- 最长有效括号子串是 “()()”
-
示例 3:
- 输入:s = “”
- 输出:0
- 提示:
- 0 ≤ s . l e n g t h ≤ 3 ∗ 1 0 4 0 \leq s.length \leq 3 * 10^4 0≤s.length≤3∗104
- s[i] 为 ‘(’ 或 ‘)’
二、解决思路和代码
1. 解决思路
- 分析:借助栈的思想
- 定义一个栈 stack,记录有效(格式正确且连续)括号子串的起始位置
- 初始栈首元素 stack[0]=-1,stack[0]用来做标记,方便计算最长有效括号子串的长度
- 遍历字符串 s ,
- 遇到 ‘(’: 该字符可能是有效括号子串的起始位置,将索引值压入栈中
- 遇到 ‘)’: 该字符可能是有效括号子串的结束位置
- 弹出栈顶元素(两种可能:如果len(stack)=0 : 为标记元素; 否则 : 有效括号子串的起始位置)
- if len(stack)=0:
- 将索引值压入栈中,作为新的标记元素
- else:
- 是有效括号子串,记录并更新最长有效括号子串的长度
- 定义一个栈 stack,记录有效(格式正确且连续)括号子串的起始位置
- 举例:s = “)()())”
初始化:stack = [-1], result=0 i=0, ')': stack = [], stack = [0] i=1, '(': stack = [0, 1] i=2, ')': stack = [0], result = max(result, i-stack[0]) = 2 i=3, '(': stack = [0, 3] i=4, ')': stack = [0], result = max(result, i-stack[0]) = 4 i=5, ')': stack = [], stack = [5]
2. 代码
class Solution:
def longestValidParentheses(self, s: str) -> int:
if len(s)<=1: return 0
result = 0
stack = [-1]
for i in range(len(s)):
if s[i]=='(':
stack.append(i)
else:
stack.pop()
if len(stack)==0:
stack.append(i)
else:
result = max(result, i-stack[-1])
return result