给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1.栈
入栈的是下标,左括号入栈,右括号出栈,若为空,右括号自己入栈,若非空,出栈,然后用当前下标减去栈顶下标,这个结果就是当前右括号为结尾的有效括号长度。
class Solution {
public:
int longestValidParentheses(string s) {
int ans = 0;
stack st;
st.push(-1);
for (int i = 0; i < s.size(); i++){
if (s[i] == '('){
st.push(i);
}
else{
st.pop();
if (st.empty()) st.push(i);
else ans = max(ans, i - st.top());
}
}
return ans;
}
};
2.计数
在此方法中,我们利用两个计数器 \textit{left}left 和 \textit{right}right 。首先,我们从左到右遍历字符串,对于遇到的每个 \text{‘(’}‘(’,我们增加 \textit{left}left 计数器,对于遇到的每个 \text{‘)’}‘)’ ,我们增加 \textit{right}right 计数器。每当 \textit{left}left 计数器与 \textit{right}right 计数器相等时,我们计算当前有效字符串的长度,并且记录目前为止找到的最长子字符串。当 \textit{right}right 计数器比 \textit{left}left 计数器大时,我们将 \textit{left}left 和 \textit{right}right 计数器同时变回 00。
class Solution {
public:
int longestValidParentheses(string s) {
int l,r;
int ans = 0;
l = 0; r = 0;
for (int i = 0; i < s.size(); i++){
if (s[i] == '(') l++;
else r++;
if (l == r) ans = max(ans, l + r);
if (l < r) l = 0, r = 0;
}
l = 0; r = 0;
for (int i = s.size() - 1; i >= 0; i--){
if (s[i] == '(') l++;
else r++;
if (l == r) ans = max(ans, l + r);
if (l > r) l = 0, r = 0;
}
return ans;
}
};