【leetcode】32.(Hard)Longest Valid
阿新 • • 發佈:2018-11-11
解題思路:
這道題的意思就是在在一串左右括號中,找到最長匹配的連續括號子串長度。
比如:
()(())))) 最長的有效子串長度是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;
}
}
執行結果: