[leetcode]32. 最長有效括號
阿新 • • 發佈:2020-07-05
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。