32. 最长有效括号
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())
" 输出: 4 解释: 最长有效括号子串为"()()"
class Solution {
public int longestValidParentheses(String s) {
if(s.length()<=1)
return 0;
int []dp=new int[s.length()];
dp[0]=0;
for(int i=1;i<s.length();i++)
{
if(s.charAt(i)==')'&&s.charAt(i-1)=='(')
dp[i]=dp[i-1]+1;
else if(s.charAt(i)==')'&&dp[i-1]!=0&&(i-2*dp[i-1]-1)>=0&&s.charAt(i-2*dp[i-1]-1)=='(')
if(i-2*dp[i-1]-2>=0&&s.charAt(i-2*dp[i-1]-2)==')')
dp[i]=dp[i-2*dp[i-1]-2]+dp[i-1]+1;
else
dp[i]=dp[i-1]+1;
else if(s.charAt(i)=='('&&s.charAt(i-1)==')'&&dp[i-1]!=0)
dp[i]=dp[i-1];
else
dp[i]=0;
}
Arrays.sort(dp);
return 2*dp[dp.length-1];
}
}
class Solution {
public int longestValidParentheses(String s) {
if(s == null || s.isEmpty()) return 0;
char[] chars = s.toCharArray();
int cnt = 0 , pre;
int[] dp = new int[chars.length];
for (int i = 1; i < chars.length; ++i) {
if(chars[i] == ')' && ((pre = i - dp[i - 1] - 1) >= 0 && chars[pre] == '(')) {
dp[i] = 2 + dp[i - 1] + (pre > 0 ? dp[pre - 1] : 0);
cnt = Math.max(cnt ,dp[i]);
}
}
return cnt;
}
}