Leetcode 32 最長有序括號 Java
阿新 • • 發佈:2018-11-07
Leetcode 32 最長有序括號
題目描述
給定一個只包含 ‘(’ 和 ‘)’ 的字串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: “(()”
輸出: 2
示例 2:
輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串為 “()()”
解題思路
對於後進先出的情況,利用棧。stack.peek()(棧頂)一直儲存著有效括號開始的下標
遍歷字串,
如果是左括號,或者是右括號但棧頂沒有與之匹配的左括號,則入棧。
如果為右括號,且棧頂有左括號與之匹配,則左括號出棧,出棧後:
如果棧是空的,說明前面的序列一直是有效的,max = i + 1;如果棧不為空,則這段有效括號的長度為:i - stack.peek()。stack.peek()一直儲存著有效括號開始的下標
程式碼
public int longestValidParentheses(String s) { Stack<Integer> stack = new Stack<Integer>(); char[] c = s.toCharArray(); int max = 0; for(int i = 0; i < c.length; i++) { //如果為右括號,且棧頂有左括號與之匹配 if(c[i] == ')' && ! stack.isEmpty() && c[stack.peek()] == '(') { stack.pop();//左括號出棧 //如果棧是空的,說明前面的序列一直是有效的 if(stack.isEmpty()) { max = i + 1; } else if(max < i - stack.peek()){ //左括號出棧後,如果棧不為空,則這段有效括號的長度為:i - stack.peek(), //因為左括號出棧了,所以peek()代表的下標減1了,所以才會讓有效括號的長度==i - stack.peek() //即左括號出棧後,peek()代表有效陣列開始的下標-1 max = i - stack.peek(); } } else { //如果不是右括號,或者沒有與之匹配的左括號,則入棧 stack.push(i); } } return max; }