1. 程式人生 > 實用技巧 >[leetcode]32. 最長有效括號

[leetcode]32. 最長有效括號

32. 最長有效括號

Difficulty: 困難

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

示例 1:

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

示例 2:

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

Solution 1 棧

​class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> st;st.push(-1);
        int length = s.length(),maxLength = 0;
        for(int i = 0;i<length;++i){
            if(s[i] == '('){
                st.push(i);
            } else {
                int cur = st.top();
                st.pop();
                if(st.empty()){
                    //if index of -1 pop,then this is the last invalid position of right
                    //parentheres so far
                    st.push(i);
                } else {
                    maxLength = max(maxLength,i-st.top());
                    //at least there is an index -1 if it's valid
                }
            }
        }
        return maxLength;
    }
};

思路

  • 對於這類括號匹配這種情況,基本上第一想法都是棧,左括號進棧,右括號出棧。
  • 棧底維護了當前最右不匹配右括號下標,如果能排空棧,則說明當前這個右括號即為最右不匹配右括號,把下標入棧,如果不能排空,則說明能匹配上,更新最大匹配括號的子串的長度即可
  • 假設最左邊有一個),使得一開始有(的情況得以統一,即最右不匹配右括號下標為-1。