一、题设
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
二、基本思路
先从前往后遍历一遍字符串,并记录左右括号的个数,一旦有右括号比左括号多的情况立马重置计数器并从当前开始计数(一定有一个左括号无法与右括号匹配例如”())“),一旦有左右括号个数情况相等的情况与最值比较后存在max_len_res中;接着重置计数器并从后往前遍历一遍字符串,并记录左右括号的个数,一旦有左括号比右括号多的情况立马重置计数器并从当前开始计数(一定有一个右括号无法与右括号匹配例如”(()“),一旦有左右括号个数情况相等的情况与最值比较后存在max_len_res中。注意一定要两遍遍历字符串以保证最后结果的准确性
三、代码实现
def longestValidParentheses(self, s):
max_len_res,left,right = 0,0,0
# 从左往右记录字符串中左右括号的个数
for i in range(len(s)):
if s[i] == '(':
left += 1
else:
right += 1
# 如果有右括号个数>左括号个数的,重新计数
if right > left:
left,right = 0,0
elif right == left:
max_len_res = (left * 2 if left * 2>max_len_res else max_len_res)
left,right = 0,0 # 不要漏
# 从右往左记录字符串中左右括号的个数
for i in range(len(s)-1,-1,-1):
if s[i] == '(':
left += 1
else:
right += 1
# 如果有左括号个数>右括号个数的,重新计数
if right < left:
left,right = 0,0
elif right == left:
max_len_res = (left * 2 if left * 2>max_len_res else max_len_res)
return max_len_res
四、效率总结