32. 最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
1 /** 2 * @param {string} s 3 * @return {number} 4 */ 5 var longestValidParentheses = function(s) { 6 let maxLen = 0; 7 const len =s.length; 8 const dp = new Array(len).fill(0); 9 for(let i=1;i<len;i++){ 10 if(s[i]===')'){//以“)”结尾的字符才有效 11 if(s[i-1]==="("){//如果前一个位置是“(”,则能与当前字符形成有效括号 12 if(i-2>=0){//如果前2个位置还有字符串 13 dp[i]=dp[i-2]+2;//当前状态等于当前匹配的2个字符加上前两个位置匹配最长字符长度 14 }else{//如果前2个位置没有字符串 15 dp[i]=2;//当前状态等于当前匹配的2个字符 16 } 17 //以i-1结尾的有效字符在向前看1个位置,如果是“(”则能与当前字符形成有效括号 18 } else if (s[i-dp[i-1]-1]==="("){ 19 if(i-dp[i-1]-2>=0){//以i-1结尾的有效字符在向前看2个位置,如果>=0 20 //当前状态=以i-1结尾的有效字符长度+当前匹配2个有效括号+以i-dp[i-1]-2结尾的有效数字 21 dp[i]=dp[i-1]+2+dp[i-dp[i-1]-2] 22 }else { 23 //以i-1结尾的有效数字再向前看2个位置,如果<0 24 //当前状态=以i-1结尾的有效字符长度+当前匹配2个有效括号 25 dp[i]=dp[i-1]+2 26 } 27 } 28 } 29 maxLen = Math.max(maxLen,dp[i]) 30 } 31 return maxLen; 32 };

浙公网安备 33010602011771号