class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return int整型
     */
    int longestValidParentheses(string s) {
        // write code here
        int res=0;
        //int dp[s.size()];
        vector<int> dp(s.size(),0);
        int pre=0;
        for(int i=1;i<s.size();i++){
            if(s[i]==')'){
                pre=i-dp[i-1]-1;//记录此时'('对应最近的左边位置,并判断是否匹配为'('
                if(pre>=0&&s[pre]=='('){//pre可能为负值(没有可匹配的位置),此时会越界没有判断的意义
                    dp[i]=dp[i-1]+2+(pre>0?dp[pre-1]:0);//前一位置的长度+2并判断是否能能连接更前面的括号
                }
            }
            res=max(res,dp[i]);
        }
        //不能返回dp[s.size()-1],因为上述代码只在有')'时才dp[i]才进行更新,若最后一位为'('返回的答案是错误的
        return res;
    }
};