题目描述:
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
Accepted C++ Solution:
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size(), longest = 0;
stack<int> st;
for (int i = 0; i < n; i++) {
if(s[i] == '(') st.push(i);
else { //s[i] = ')'
if(!st.empty()) {
if(s[st.top()] == '(') st.pop();
else st.push(i);
}
else st.push(i);
}
}
if(st.empty()) longest = n;
else {
int a = n, b = 0;
while(!st.empty()) {
b = st.top(); st.pop();
longest = max(longest,a-b-1); //计算每个间隔之间的长度
a = b;
}
longest = max(longest,a);
}
return longest;
}
};
遇到 '(' or 遇到 ’)' 但是栈顶元素不为'(' 则把下标i压入栈中,代表着一个间隔。
计算最后栈中每个下标之前的间隔,就能得到最大的有效括号长度。