32. Longest Valid Parentheses
Description
Given a string containing just the characters '('
and ')'
, return 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:
0 <= s.length <= 3 * 104
s[i]
is'('
, or')'
.
Solutions
Solution 1: Dynamic Programming
We define \(f[i]\) to be the length of the longest valid parentheses that ends with \(s[i-1]\), and the answer is \(max(f[i])\).
When \(i \lt 2\), the length of the string is less than \(2\), and there is no valid parentheses, so \(f[i] = 0\).
When \(i \ge 2\), we consider the length of the longest valid parentheses that ends with \(s[i-1]\), that is, \(f[i]\):
- If \(s[i-1]\) is a left parenthesis, then the length of the longest valid parentheses that ends with \(s[i-1]\) must be \(0\), so \(f[i] = 0\).
- If \(s[i-1]\) is a right parenthesis, there are the following two cases:
- If \(s[i-2]\) is a left parenthesis, then the length of the longest valid parentheses that ends with \(s[i-1]\) is \(f[i-2] + 2\).
- If \(s[i-2]\) is a right parenthesis, then the length of the longest valid parentheses that ends with \(s[i-1]\) is \(f[i-1] + 2\), but we also need to consider whether \(s[i-f[i-1]-2]\) is a left parenthesis. If it is a left parenthesis, then the length of the longest valid parentheses that ends with \(s[i-1]\) is \(f[i-1] + 2 + f[i-f[i-1]-2]\).
Therefore, we can get the state transition equation:
Finally, we only need to return \(max(f)\).
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the length of the string.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Solution 2: Using Stack
- Maintain a stack to store the indices of left parentheses. Initialize the bottom element of the stack with the value -1 to facilitate the calculation of the length of valid parentheses.
- Iterate through each element of the string:
- If the character is a left parenthesis, push the index of the character onto the stack.
- If the character is a right parenthesis, pop an element from the stack to represent that we have found a valid pair of parentheses.
- If the stack is empty, it means we couldn't find a left parenthesis to match the right parenthesis. In this case, push the index of the character as a new starting point.
- If the stack is not empty, calculate the length of the valid parentheses and update it.
Summary:
The key to this algorithm is to maintain a stack to store the indices of left parentheses and then update the length of the valid substring of parentheses by pushing and popping elements.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\), where \(n\) is the length of the string.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|