LeetCode 最长有效括号
题目:
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
题目分析:
最长有效括号子串包含两种情况:
例1:
(())
有效子串长为4
例2:
()()
有效子串长为4
所以在处理的时候分情况讨论
首先编写校验字符串是否有效的函数:
def validate_str(str):
if len(str) == 2:
if str[0] == '(' and str[1] == ')':
return True
else:
return False
if str[-1] == ')' and str[-2] == '(':
res = validate_str(str[:-2])
elif str[0] == '(' and str[1] == ")" and str[2] == "(":
res = validate_str(str[2:])
elif str[0] == '(' and str[-1] == ")":
res = validate_str(str[1:-1])
else:
res = False
return res
后续要想得出最长有效括号就是把括号替换掉,同时保留替换的过程。
完整代码如下
class Solution:
def longestValidParentheses(self, s) -> int:
s_len = len(s)
legal_list = []
# 根据字符串长度 构建有效括号list
if s_len % 2:
s_half_len = int((s_len - 1) / 2)
else:
s_half_len = int(s_len / 2)
if s_half_len < 1:
return 0
for i in range(s_half_len):
src_str = '(' + i * '__' + ')'
legal_list.append(src_str)
# 更新原有s
max_sub = 0
for idx, sub in enumerate(legal_list):
if sub in s:
s = s.replace(sub, (idx + 1) * '__')
max_sub = sub
# 获取最长下划线
s = s.replace(')', '(')
new_s_list = s.split('(')
max_len = 0
for idx, ele in enumerate(new_s_list):
if len(ele) > max_len:
max_len = len(ele)
return max_len

浙公网安备 33010602011771号