题目描述
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
思路
通过栈来记录左括号的下标。难点是需要定义个start变量来记录合法括号子串的起始位置。遍历字符串,如果遇到左括号,则将当前下标压入栈,如果遇到右括号,且当前栈为空,则将下一个坐标位置记录到start,这里非常关键;如果栈不为空,弹出栈顶元素,若此时栈为空,则更新结果和i - start + 1中的较大值,否则更新结果和i - 栈顶元素中的较大值。
代码
class Solution {
public:
int longestValidParentheses(string s) {
int res = 0;
int n = s.size();
if (n < 2) return res;
stack<int> myStack;
int start = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(') myStack.emplace(i);
else {
if (myStack.empty()) start = i+1;
else {
myStack.pop();
res = myStack.empty() ? max(res, i-start+1) : max(res, i-myStack.top());
}
}
}
return res;
}
};