解题思路:
这道题的意思就是在在一串左右括号中,找到最长匹配的连续括号子串长度。
比如:
()(())))) 最长的有效子串长度是6
()(((((((()) 最长的有效子串长度是4
我的想法是DP,但是是不完全的DP。
首先建立一个数组mark[]。
例如,对于 ()(())))):
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
字符串 | ( | ) | ( | ( | ) | ) | ) | ) | ) |
mark值 | -1 | 1 | -1 | -1 | 1 | 2 | -1 | -1 | -1 |
从下标为0到下标8的顺序计算mark值
所有的左括号mark值都是-1,遇到右括号则判别以当前右括号为尾的有效子串个数是多少
最后返回最长有效子串个数的2倍(长度)
提交代码:
class Solution {
public int longestValidParentheses(String s) {
int mark[]=new int[50000];
int maxlen=0;
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='(')
mark[i]=-1;
else {
if(i==0) mark[i]=-1;
else if(i>0&&s.charAt(i-1)=='(') { //()
mark[i]=1;
if(i>2&&mark[i-2]>0) //()()
mark[i]=mark[i-2]+1;
if(mark[i]>maxlen) maxlen=mark[i];
}
else if(mark[i-1]==-1) mark[i]=-1; //))))
else if(i>0&&s.charAt(i-1)==')') {
int leftpos=i-2*mark[i-1]-1;
if(leftpos>=0&&s.charAt(leftpos)=='(') { //(())
mark[i]=mark[i-1]+1;
leftpos=i-2*mark[i];
if(leftpos>=0&&mark[leftpos]>0) //()(())
mark[i]+=mark[leftpos];
if(mark[i]>maxlen) maxlen=mark[i];
}
else mark[i]=-1;
}
else mark[i]=-1;
}
}
return maxlen*2;
}
}
运行结果: