题目
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
提示:
- 0 <= s.length <= 3 * 1 0 4 10^4 104
- s[i] 为 ‘(’ 或 ‘)’
解法
class Solution {
public:
int longestValidParentheses(string s) {
/* 1.利用两个计数器 left 和 right ,贪心地考虑了以当前字符下标结尾的有效括号长度
2. 不需要额外的空间
3. 贪心算法会漏掉一种情况,就是遍历的时候左括号的数量始终大于右括号的数量,即 (() ,因此从右方向往左再遍历一次。
*/
int left=0, right=0,maxlength=0;
for(int i = 0; i < s.length();i++){
if(s[i] == '('){
left++;
}else{
right++;
}
if(left == right){
maxlength = max(maxlength,2*right);
}else if(right > left){
left = 0;
right = 0;
}
}
// 第二趟,从后往前
left = right = 0;
for(int i = (int)s.length()-1; i>=0; i--){
if(s[i] == '('){
left++;
}else{
right++;
}
if(left == right){
maxlength = max(maxlength,2*left);
}else if(left > right){
left = right = 0;
}
}
return maxlength;
}
};
笔记
class Solution {
public:
int longestValidParentheses(string s) {
// 栈
int maxans = 0;
stack<int> stk;
stk.push(-1); //initialize
for(int i = 0 ; i < s.length();i++){
if(s[i] == '('){
stk.push(i);
}else{
stk.pop();
if(stk.empty()){
stk.push(i);
}else{
maxans = max(maxans,i-stk.top());
}
}
}
return maxans;
}
};