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

你可能感兴趣的:(大数据之路,leetcode,算法,最长有效括号)