leetcode32:最長有效括號(棧:解決成對字符)

棧 以後碰到解決成對出現的字符

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

示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串爲 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串爲 "()()"

思路分析:

解題思路:棧 以後碰到解決成對出現的字符
 
1.需有一個變量start記錄有效括號子串的起始下標,max表示最長有效括號子串長度,初始值均爲0
 
2.遍歷給字符串中的所有字符()
 
    2.1若當前字符s[index]爲左括號'(',將當前字符下標index入棧(下標稍後有其他用處),處理下一字符
 
    2.2若當前字符s[index]爲右括號')',判斷當前棧是否爲空
 
        2.2.1若棧爲空,則start = index + 1(有效括號子串的起始下標+1),處理下一字符(當前字符右括號下標不入棧)
 
        2.2.2若棧不爲空,則出棧(由於僅左括號入棧,則出棧元素對應的字符一定爲左括號下標,可與當前字符右括號配對),判斷棧是否爲空
 
            2.2.2.1若棧爲空,則max = max(max, index-start+1)
 
            2.2.2.2若棧不爲空,則max = max(max, index-棧頂元素值)

總結:2.1處理左括號分支; 2.2處理右括號分支。
總是遇到左括號下標入棧(右括號不入棧)。
遇到右括號去判斷棧裏是否有左括號,棧爲空(不存在‘(’)就有效括號子串的起始下標後移一位,繼續當前起始下標位置判斷;棧不爲空,就出棧(移除‘(’,這個是右括號分支,配對‘()’,出棧了)。
在出棧後還得判斷是否棧空來計算有效括號長度

class Solution {
    public int longestValidParentheses(String s) {
    //max是返回的有效長度,start是有效的括號起始下標,即()
        int max = 0, start = 0;
        if(null == s) return 0;
        int len = s.length();
        Stack<Integer> stack = new Stack<>();
        for(int index = 0; index < len; index++){
            //遇左括號(,壓棧(棧中元素爲當前位置所處的下標)
            if('(' == s.charAt(index)){
                stack.push(index);
            } else {
            //棧爲空就說明棧裏沒有'(',起始下標後移
                if(stack.isEmpty()){
                    start = index+1;
                } else {
                //棧非空就存在'(',此時與右括號分支中')'匹配,出棧
                    stack.pop();
                    //出棧後再次判斷棧是否爲空,來計算有效括號長度
                    if(stack.isEmpty()){
                        max = Math.max(max, index-start+1);
                    } else {
                        max = Math.max(max, index-stack.peek());//stack.peek()得到棧頂元素,但是不刪除棧頂元素
                    }
                }
            }
        }
 
        return max;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章