1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
class Solution:
def longestValidParentheses(self, s: str) -> int:
res = 0 # 最终结果,存储最长有效括号子串的长度
# 第一次扫描:从左到右
# cnt:计数器,用于记录左括号和右括号的差值
# l:左指针,表示当前子串的起始位置
l, r, cnt = 0, 0, 0
for r in range(len(s)):
# 每遇到左括号 `(`,cnt += 1;每遇到右括号 `)`,cnt -= 1
cnt += int(s[r] == '(') - int(s[r] == ')')
# 如果 cnt == 0,说明当前子串是一个有效括号子串
# 更新结果为当前子串长度 (r - l + 1) 和当前结果中的较大值
if not cnt:
res = max(res, r - l + 1)
# 如果 cnt < 0,说明当前子串无效(右括号多于左括号)
# 重置左指针和计数器
if cnt < 0:
l, cnt = r + 1, 0
# 第二次扫描:从右到左
# cnt:计数器,用于记录右括号和左括号的差值
# r:右指针,表示当前子串的结束位置
l, r, cnt = len(s) - 1, len(s) - 1, 0
for l in range(len(s) - 1, -1, -1):
# 每遇到右括号 `)`,cnt += 1;每遇到左括号 `(`,cnt -= 1
cnt += int(s[l] == ')') - int(s[l] == '(')
# 如果 cnt == 0,说明当前子串是一个有效括号子串
# 更新结果为当前子串长度 (r - l + 1) 和当前结果中的较大值
if not cnt:
res = max(res, r - l + 1)
# 如果 cnt < 0,说明当前子串无效(左括号多于右括号)
# 重置右指针和计数器
if cnt < 0:
r, cnt = l - 1, 0
return res
|