- 最长有效括号(困难)
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
- 动态规划(图片转自leetcode官解)
class Solution:
def longestValidParentheses(self, s: str) -> int:
if len(s) < 2:
return 0
dp = [0] * len(s)
for i in range(len(s)):
if s[i] == ')':
if i - 1 >= 0 and s[i - 1] == '(':
dp[i] = dp[i - 2] + 2
elif s[i - 1] == ')' and i - dp[i - 1] - 1 >= 0 and s[i - dp[i - 1] - 1] == '(':
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2
return max(dp)
- 栈(图片转自leetcode官解)
class Solution:
def longestValidParentheses(self, s: str) -> int:
l, cur_l = 0, 0
stack = [-1]
for i in range(len(s)):
if s[i] == '(':
stack.append(i)
else:
stack.pop()
if stack == []:
stack.append(i)
else:
cur_l = i - stack[-1]
l = max(cur_l, l)
return l
- 正逆向匹配(图片转自leetcode官解)
class Solution:
def longestValidParentheses(self, s: str) -> int:
left, right, l = 0, 0, 0
for i in range(len(s)):
if s[i] == '(':
left += 1
elif s[i] == ')':
right += 1
if left == right:
l = max(l, 2 * left)
if left < right:
left = right = 0
left = right = 0
for i in range(len(s) - 1, -1, -1):
if s[i] == '(':
left += 1
elif s[i] == ')':
right += 1
if left == right:
l = max(l, 2 * left)
if left > right:
left = right = 0
return l