32.最長有效括號
阿新 • • 發佈:2022-02-27
目錄
32.最長有效括號
題目
給你一個只包含 '('和 ')'的字串,找出最長有效(格式正確且連續)括號子串的長度。
示例 1:
輸入:s = "(()"
輸出:2
解釋:最長有效括號子串是 "()"
示例 2:
輸入:s = ")()())"
輸出:4
解釋:最長有效括號子串是 "()()"
示例 3:
輸入:s = ""
輸出:0
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/longest-valid-parentheses
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解
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; } };