- 题目描述
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
来源:LeetCode
- 示例
-
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()” -
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
- 思路分析
动态规划。定义: l v p [ i ] lvp[i] lvp[i] = 以 i i i结束的最长有效括号长度。如果 i i i位置是’(’,则不用管,继续看下一位;如果 i i i位置是’)’,则需要考虑匹配。因为知道 l v p [ i − 1 ] lvp[i-1] lvp[i−1],所以可以找到应该和 i i i匹配的位置。如果该位置是左括号,则匹配成功。需要特殊处理的是独立括号的情况,比如字符串"()()(())"的前两个括号就是独立括号。
- JAVA实现
public int longestValidParentheses(String s) {
int len = s.length();
if(len==0) return 0;
int max=0;
int[] lvp = new int[len];
for(int i=0;i<len;i++) lvp[i]=0;
for(int j=1;j<len;j++) {
if(s.charAt(j)==')') {
int left = j-lvp[j-1]-1; //找到应该匹配的位置
if(left>=0) {
if(s.charAt(left)=='(') {
lvp[j]=lvp[j-1]+2;
if(left>0) lvp[j]+=lvp[left-1]; //前面有独立括号
}
if(lvp[j]>max) max=lvp[j];
}
}
}
return max;
}