/*
f[i] = ')' f[i - 1] = '(' f[i] = f[i - 2] + 2;
f[i] = ')' f[i - 1] = ')' if (s[i - f[i - 1] - 1] == '(') f[i] = f[i - 1] + 2 + f[i - f[i - 1] - 2];
*/
class Solution {
public int longestValidParentheses(String s) {
int n = s.length();
int[] f= new int[n];
for (int i = 0; i < n; i ++) {
if (s.charAt(i) == ')') {
if (i > 0) {
if (s.charAt(i - 1) == ')') {
if (i - f[i - 1] - 1 >= 0) {
if (s.charAt(i - f[i - 1] - 1) == '(') {
if (i - f[i - 1] - 2 >= 0) {
f[i] = f[i - 1] + 2 + f[i - f[i - 1] - 2];
}
else f[i] = f[i - 1] + 2;
}
}
}
else {
if (i - 2 >= 0) f[i] = f[i - 2] + 2;
else f[i] = 2;
}
}
}
}
int res = 0;
for (int i = 0; i < n; i ++) res = Math.max(res, f[i]);
return res;
}
}