LeetCode第三十二题—Python实现


title: LeetCode No.32

categories:

  • OJ
  • LeetCode

tags:

  • Programing
  • LeetCode
  • OJ

LeetCode第三十二题

题目描述

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:

输入:s = ""
输出:0
 

提示:

0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'

代码

class Solution(object):
    def longestValidParentheses(self, s):
        """
        :type s: str
        :rtype: int
        核心思想:使用动态规划求解问题
                碰到")" 为基础长度为2
                内部连在一起的的长度为dp[i-1]
                外部连在一起的长度为dp[i-dp[i-1]-2]
                状态转移方程为:2 + dp[i-1] + dp[i-dp[i-1]-2]
        """
        length = len(s)
        if length == 0:
            return 0
        dp = [0] * length
        for i in range(1,length):
        	# 当遇到右括号时,尝试向前匹配左括号
            if s[i] == ')':
                pre = i - dp[i-1] -1
                # 如果是左括号,则更新匹配长度
                if pre >= 0 and s[pre] == '(':
                    dp[i] = dp[i-1] + 2
                    # 处理独立的括号对的情形 类似()()、()(())
                    if pre > 0:
                        dp[i] += dp[pre-1]
        return max(dp)
    
if __name__ == '__main__':
    s = Solution()
    print(s.longestValidParentheses(s = "()(())))"))

猜你喜欢

转载自blog.csdn.net/qq_16184125/article/details/113662538
今日推荐