# 32-longest-valid-parentheses Try it on leetcode ## Description

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

 

Example 1:

Input: s = "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()".

Example 2:

Input: s = ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()".

Example 3:

Input: s = ""
Output: 0

 

Constraints:

## Solution(Python) ```Python class Solution: def longestValidParentheses(self, s: str) -> int: return self.optimal(s) # Time Complexity: O(n^3) # Space Complexity: O(n) def bruteforce(self, s: str) -> int: n = len(s) maxlen = 0 for i in range(n): for j in range(i + 2, n + 1, 2): if self.isvalid(s[i:j]): if j - i > maxlen: maxlen = j - i return maxlen # Time Complexity: O(n) # Space Complexity: O(n) def dynamicprogramming(self, s: str) -> int: maxlen = 0 n = len(s) dp = [0] * n for i in range(1, n): if s[i] == ")": if s[i - 1] == "(": dp[i] = (dp[i - 2] if i >= 2 else 0) + 2 elif i - dp[i - 1] and s[i - dp[i - 1] - 1] == "(": dp[i] = ( dp[i - 1] + (dp[i - dp[i - 1] - 2] if dp[i - 1] >= 2 else 0) + 2 ) if dp[i] > maxlen: maxlen = dp[i] return maxlen # Time Complexity: O(n) # Space Complexity: O(n) def stack(self, s: str) -> int: stack = [-1] maxlen = 0 for i, c in enumerate(s): if c == "(": stack.append(i) else: stack.pop() if not stack: stack.append(i) else: maxlen = max(maxlen, i - stack[-1]) return maxlen # Time Complexity: O(n) # Space Complexity: O(1) def optimal(self, s: str) -> int: left = 0 right = 0 maxlen = 0 for c in s: if c == "(": left += 1 else: right += 1 if left == right: maxlen = max(maxlen, left + right) elif right >= left: left = right = 0 left = right = 0 for c in s[::-1]: if c == "(": left += 1 else: right += 1 if left == right: maxlen = max(maxlen, left + right) elif left >= right: left = right = 0 return maxlen def isvalid(self, s): stack = [] for c in s: if c == "(": stack.append("(") elif len(stack) > 0 and stack[-1] == "(": stack.pop() else: return False return len(stack) > 0 ```