给出一个仅包含字符’(‘和’)'的字符串,计算最长的格式正确的括号子串的长度。
对于字符串"(()“来说,最长的格式正确的子串是”()",长度为2.
再举一个例子:对于字符串")()())",来说,最长的格式正确的子串是"()()",长度为4.
# !/usr/bin/env python
# -*- coding: utf-8 -*-
#
#
# @param s string字符串
# @return int整型
#
class Solution:
def longestValidParentheses(self , s ):
maxans = 0
stack = list() # 始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」
stack.append(-1)
for i in range(len(s)):
if s[i] == '(':
stack.append(i) # 对于遇到的每个'(' ,我们将它的下标放入栈中
else:
stack.pop() # 对于遇到的每个')' ,我们先弹出栈顶元素表示匹配了当前右括号
if len(stack) == 0:
stack.append(i) # 如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」
else:
maxans = max(maxans, i - stack[-1]) # 如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」
print(maxans)
s = Solution()
s.longestValidParentheses('()(()')
# 动态规划
class Solution:
def longestValidParentheses(self, s):
l = len(s)
dp = [0] * l # dp[i]表示s中以下标i结尾的最长合法子串长度
maxVal = 0 # 最终结果为所有dp[i]中的最大值,该子串肯定在s中以某一字符结尾!!!
for i in range(l):
if s[i] == ')': # 如果s[i] == '(',则dp[i] = 0,不合法
if i >= 1 and s[i - 1] == "(": # 第一种情况 '...()',dp[i] += dp[i-2],
dp[i] = 2
if i - 2 >= 0:
dp[i] += dp[i-2]
elif dp[i-1] > 0: # 第二种情况 '...))'
if i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(': # '...((...))'
dp[i] = dp[i - 1] + 2
if i - dp[i - 1] - 2 >= 0: # '...(...)((...))'
dp[i] += dp[i - dp[i - 1] - 2]
maxVal = max(maxVal, dp[i])
return maxVal