给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 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 }