import java.util.*;
public class Solution {
    public int longestValidParentheses (String s) {
        int res = 0;
        //长度为0的串或者空串,返回0
        if(s.length() == 0 || s == null) 
            return res;
        //dp[i]表示以下标为i的字符为结束点的最长合法括号长度
        int[] dp = new int[s.length()];  
        //第一位不管是左括号还是右括号都是0,因此不用管
        for(int i = 1; i < s.length(); i++){ 
            //取到左括号记为0,有右括号才合法
            if(s.charAt(i) == ')'){ 
                //如果该右括号前一位就是左括号
                if(s.charAt(i - 1) == '(') {

                    //新增两个
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2; 
               
                }else if(i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
                    //找到这一段连续合法括号序列前第一个左括号做匹配,
                    //如果存在并且第一个左括号前还有数,可以再加上第一个左括号前的有效括号
                      dp[i] = (i - dp[i - 1] > 1 ? dp[i - dp[i - 1] - 1-1] : 0) + dp[i - 1] + 2;
                }
                  
            }
            //维护最大值
            res = Math.max(res, dp[i]); 
        }
        return res;
    }
}