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 };

 

posted @ 2022-10-13 20:00  icyyyy  阅读(35)  评论(0)    收藏  举报