Problem
Given a string containing just the characters `(` and `)`, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"
Solution
DP
class Solution {
public int longestValidParentheses(String s) {
//()((()))
//()()()()
int max = 0, left = 0;
int[] dp = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == `(`) left++;
else {
if (left != 0) {
dp[i] = dp[i-1]+2;
if (i-dp[i] >= 0) dp[i] += dp[i-dp[i]];
max = Math.max(max, dp[i]);
left--;
}
}
}
return max;
}
}
Stack
class Solution {
public int longestValidParentheses(String s) {
//stack to store index
Stack<Integer> stack = new Stack<>();
int max = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == `)` && !stack.isEmpty() && s.charAt(stack.peek()) == `(`) {
//remove this pair
stack.pop();
//update the length of this pair
//
//if starts with )
if (!stack.isEmpty()) max = Math.max(max, i-stack.peek());
//if starts with (
else max = i+1;
} else {
stack.push(i);
}
}
return max;
}
}