1. 程式人生 > >LeetCode-32.最長有效括號

LeetCode-32.最長有效括號

成功 length ren 不為 ring 下標 數組 動態 nth

給定一個只包含 ‘(‘‘)‘ 的字符串,找出最長的包含有效括號的子串的長度。

示例 1:

輸入: "(()"
輸出: 2
解釋: 最長有效括號子串為 "()"

示例 2:

輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串為 "()()"

 1 /*
 2     采用動態規劃建立一個與給定字符串長度相等的數組dp
 3     1.從下標為1的開始遍歷,若當前下標為i的字符為‘(‘時,則跳過(默認置為0)
 4     2.若當前下標為i的字符為‘)’時,獲取dp[]中前一個字符的數值,即dp[i-1],並獲取指向的前dp[i-1]個字符下標(跳過有效括號字串,尋找前面未匹配的括號)
5 3.若有效括號字串的前一個字符為‘(‘,即匹配成功,當前dp[i]獲得前一個的數值加二(即dp[i]=dp[i-1]+2,2分別為()括號) 6 4.判斷是否連續的有效括號:獲得剛匹配成功的前一個dp數值,查看是否為0(即dp[i-2-dp[i-1]]),若不為0,則相當於連續字串,最後再加上dp[i-2-dp[i-1]]. 7 */ 8 class Solution { 9 public int longestValidParentheses(String s) { 10 int len=s.length(); 11 int
max=0; 12 int []dp=new int[len]; 13 for(int i=1;i<len;i++){ 14 //1. 15 if(s.charAt(i) ==‘(‘) 16 continue; 17 //2. 18 int index=i-1-dp[i-1]; 19 if(index<0) 20 continue; 21 //
3. 22 if(s.charAt(index)==‘(‘){ 23 dp[i]=dp[i-1]+2; 24 int lastindex=i-2-dp[i-1]; 25 if(lastindex>=0){ 26 if(dp[lastindex]!=0) 27 dp[i]+=dp[lastindex]; 28 } 29 } 30 if(dp[i]>max) 31 max=dp[i]; 32 } 33 return max; 34 } 35 }



LeetCode-32.最長有效括號