[day005]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 pops,then this is the last invalid position of right
//parentheres
st.push(i);
} else {
maxLength = max(maxLength,i-st.top());
//at least there is an index -1 if it's valid
}
}
}
return maxLength;
}
};
思路
- 对于这类括号匹配这种情况,基本上第一想法都是栈,左括号进栈,右括号出栈。
- 栈底维护了当前最右不匹配右括号下标,如果能排空栈,则说明当前这个右括号即为最右不匹配右括号,把下标入栈,如果不能排空,则说明能匹配上,更新最大匹配括号的子串的长度即可
- 可以假设最左边有一个
)
,使得一开始只有(
的入栈的情况得以统一,即先把最右不匹配右括号下标为-1入栈。