1. 程式人生 > 其它 >32.最長有效括號

32.最長有效括號

目錄

32.最長有效括號

題目

給你一個只包含 '('和 ')'的字串,找出最長有效(格式正確且連續)括號子串的長度。

示例 1:

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

示例 2:

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

示例 3:

輸入:s = ""
輸出:0

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/longest-valid-parentheses
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解

https://leetcode-cn.com/problems/longest-valid-parentheses/solution/shou-hua-tu-jie-zhan-de-xiang-xi-si-lu-by-hyj8/

class Solution {
    public int longestValidParentheses(String s) {
        int len = s.length();
        if(len == 0) return 0;
        int res = 0;  
        Stack<Integer> st = new Stack<>();
        st.push(-1);//作為連續的字串開頭的標識位
        for(int i=0;i<len;i++){
            if(s.charAt(i)=='(' ){//為(則對應的i入棧
                st.push(i); 
            }
            else{//為)括號
  	         st.pop();//出棧
            if(!st.isEmpty()){//如果棧不為空
                res = Math.max(res,i-st.peek());
            }else{//如果棧為空,說明參考出去了,此時以此時')'的座標為新的連續字串的開頭,新的參考進來
                st.push(i);
            }
            }
        }
        return res;
    }
}

別人的題解

太厲害了,這個想法!

用棧模擬一遍,將所有無法匹配的括號的位置全部置1
例如: "()(()"的mark為[0, 0, 1, 0, 0]
再例如: ")()((())"的mark為[1, 0, 0, 1, 0, 0, 0, 0]
經過這樣的處理後, 此題就變成了尋找最長的連續的0的長度

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> st;
        vector<bool> mark(s.length());
        for(int i = 0; i < mark.size(); i++) mark[i] = 0;
        int left = 0, len = 0, ans = 0;
        for(int i = 0; i < s.length(); i++) {
            if(s[i] == '(') st.push(i);
            else {
                // 多餘的右括號是不需要的,標記
                if(st.empty()) mark[i] = 1;
                else st.pop();
            }
        }
        // 未匹配的左括號是不需要的,標記
        while(!st.empty()) {
            mark[st.top()] = 1;
            st.pop();
        }
        // 尋找標記與標記之間的最大長度
        for(int i = 0; i < s.length(); i++) {
            if(mark[i]) {
                len = 0;
                continue;
            }
            len++;
            ans = max(ans, len);
        }
        return ans;
    }
};