32. 最長有效括號
給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: “(()”
輸出: 2
解釋: 最長有效括號子串爲 “()”
示例 2:
輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串爲 “()()”
思路
左右各自遍歷一次,不使用額外空間,空間複雜度爲O(1),時間複雜度爲O(n),有一個特別注意的點就是重置計數器,例如:從左到右遍歷優先要’(’,若’(‘的數目還少於’)’,那麼需要重置計數器爲0。從右到左遍歷也是一個道理。
實現代碼
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.size(), left = 0, right = 0, match = 0;
// 從左到右遍歷
for(int i = 0; i < len; i++){
if(s[i] == '(') ++left;
else{
++right;
if(left == right) match = max(match, left << 1);
// 若右括號數目過多,不符合題意,重置計數器
if(right > left) right = 0, left = 0;
}
}
// 從右到左遍歷,重置計數器
left = 0, right = 0;
for(int i = len - 1; i >= 0; i--){
if(s[i] == ')') ++right;
else{
++left;
if(left == right) match = max(match, left << 1);
// 與上面同理
if(left > right) right = 0, left = 0;
}
}
return match;
}
};