LeetCode-32.最长有效括号

时间:2022-02-26 06:20:17

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"


示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

 1 /*
 2     采用动态规划建立一个与给定字符串长度相等的数组dp,用于记录当前的有效括号长度
 3     1.从下标为1的开始遍历,若当前下标为i的字符为'('时,则跳过(默认置为0)
 4     2.若当前下标为i的字符为')’时,获取dp[]中前一个字符的数值,即dp[i-1],并获取指向的前dp[i-1]个字符下标(跳过有效括号字串,寻找前面未匹配的括号)
 5     3.若有效括号字串的前一个字符为'(',即匹配成功,当前dp[i]获得前一个的数值加二(即dp[i]=dp[i-1]+2,2分别为()括号)
 6     4.判断是否连续的有效括号:获得刚匹配成功的前一个dp数值,查看是否为0(即dp[i-2-dp[i-1]]),若不为0,则相当于连续字串,最后再加上dp[i-2-dp[i-1]].
 7 */
 8 class Solution {
 9     public int longestValidParentheses(String s) {
10         int len=s.length();
11         int max=0;
12         int []dp=new int[len];
13         for(int i=1;i<len;i++){
14             //1.
15             if(s.charAt(i) =='(')
16                 continue;
17             //2.
18             int index=i-1-dp[i-1];
19             if(index<0)
20                 continue;
21             //3.
22             if(s.charAt(index)=='('){
23                 dp[i]=dp[i-1]+2;
24                 int lastindex=i-2-dp[i-1];   
25                 if(lastindex>=0){
26                     if(dp[lastindex]!=0)
27                     dp[i]+=dp[lastindex];
28                 }
29             }
30             if(dp[i]>max)
31                 max=dp[i];
32         }
33         return max;
34     }
35 }