1. 程式人生 > >【leetcode】32.(Hard)Longest Valid

【leetcode】32.(Hard)Longest Valid

題目連結


解題思路:
這道題的意思就是在在一串左右括號中,找到最長匹配的連續括號子串長度。
比如:
()(()))))   最長的有效子串長度是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; } }

執行結果:
在這裡插入圖片描述