dp
dp-intervals
]
Leetcode 0032. Longest Valid Parentheses
Problem statement
https://leetcode.com/problems/longest-valid-parentheses/
Solution
This is quite difficult problem, which can be solved with dymamic programming. As usual let us define dp[i] the length of the longest valid substring ending at i-th index. We can have several cases now:
- If
i == -1, it means we reached empty string, return0, answer for empty string. Also ifs[i] = (, answer is also0, because no valid parantheses can end with( - Now, we have case, when
s[i] = ). Let us look at the previous element. If it is equal to(, then we have()as two last elements and we can returndp(i-2) + 2. - Now consider the case, when
s[i-1] = ), it means, that we have the following situation:...)). If we want to find the longest valid parentheses fori, first we need to deal withi-1. DefineP = i - dp(i-1) - 1. Then we have the following situation:
...((.....))
...P.......i
Here on the top is the structure of string and in the bottom are indexes. String from P + 1 to i - 1 indexes including is the longest valid parentheses endind with i-1 place. What we can say about place P. If we have ) element on this place, then we need to return 0: in this case we have patten ...)(...))... and we know that answer for dp(P) is equal to 0: if it is not, what we considered was not the longest answer for i-1. And if answer for dp(P) is zero, than answer for dp(i) is zero as well.
In the case, when we have ...((.....)), answer is dp(i-1) + dp(P-1) + 2.
Complexity
Time complexity is $\mathcal{O}(n)$, space complexity as well.
Code
class Solution:
def longestValidParentheses(self, s):
@lru_cache(None)
def dp(i):
if i == -1 or s[i] == "(": return 0
if i >= 1 and s[i-1:i+1] == "()": return dp(i-2) + 2
P = i - dp(i-1) - 1
if P >= 0 and s[P] == "(":
return dp(i-1) + dp(P-1) + 2
return 0
return max(dp(i) for i in range(len(s))) if s else 0
If you like the solution, you can upvote it on leetcode discussion section: Problem 0032