Leetcode 32 Solution
Leetcode Question Link
https://leetcode.com/problems/longest-valid-parentheses
Thinking Process
The most straightfowrad solution is to find out all the substrings, and then check each of them to see if they are well-formed parenthesis. If N
is the size of the string, the time complexity is O(N^3)
.
Given that the scale of the question is 3 * 10^4
, it is unlikely that we can pass if we are not O(N)
. So let’s see if we can do it within O(N)
or O(N * lg N)
.
Let’s assume that F(i)
means the longest well-formed parenthesis ending at position i
.
First of all, F(0) = 0
.
For any position after 0
, we can break down the string into this:
s = ...
x x x x x x
x
x x x x x x
s[i] . . .
For F(i)
, therer are two cases:
- If the orange character is
(
ands[i] == ')'
, it means from the substring from the orange character tos[i]
is a well-formed parenthesis, because we know the green part befores[i]
is a well-formed parenthesis. To make it even longer, we can add up the well-formed parenthesis before the orange character, i.e., the red part. In other words,F(i) = 2 + F(i - 1) + F(i - F(i - 1) - 2)
. - Otherwise, if the orange character is not
(
ors[i] != ')'
, it means there is no well-formed parenthesis ending at positioni
. In this case,F(i) = 0
.
The above algorithm can help us calculate each F(i)
in O(1)
time. So we just need to calculate all the F(i)
s, and then return the maximum one.
Time & Space Complexity
Assuming N
is the size of the string:
- Time complexity:
O(N)
- Space complexity:
O(N)
Solution
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> dp(s.size());
int max_len = 0;
for (int i = 1; i < s.size(); i++)
{
int l = i - 1 - dp[i - 1];
if (s[i] == ')' && s[l] == '(')
{
dp[i] = dp[i - 1] + 2;
if (l > 0)
dp[i] += dp[l - 1];
}
max_len = max(max_len, dp[i]);
}
return max_len;
}
};