题目描述
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"
问题分析
从前到后遍历字符串,当前字符为 '(' 时,将该字符的下标压入栈;当前字符为 ')' 时,分情况。如果此时栈为空,则说明这里是非法的,记录当前加1位置的下标为下一个可能有效子串的起始点。如果此时栈不为空,那么弹出栈顶元素。然后判断一下此时栈是否为空,如果为空,说明是 "()()" 的情况,此时最大长度为当前位置减去子串起始点加一与历史最大长度的较大者。如果不为空,说明是 "(()" 的情况,此时最大长度为当前位置减去栈顶元素的值与历史最大长度的较大者。当字符串全部遍历结束后,返回历史最大长度。
代码实现
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> sta;
int ans = 0;
int temp = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(')
sta.push(i);
else{
if(sta.empty())
temp = i + 1;
else{
sta.pop();
ans = sta.empty()? max(ans, i - temp + 1) : max(ans, i - sta.top());
}
}
}
return ans;
}
};