1. 程式人生 > >Leetcode 32 最長有序括號 Java

Leetcode 32 最長有序括號 Java

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;
    }