给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解析:一开始的想法,遍历字符串,记录左右括号的数量,当两个括号数量相同的时候更新长度。当右括号的数量大于左括号时,目前的字符串无效,将数量归零。
但是发现并不正确。
例如"(()",只遍历一遍的话无法得到正确结果。
正确的方法是遍历两次,第二次从尾部向开头遍历,将左右括号调换。
class Solution {
public:
int longestValidParentheses(string s) {
int left = 0;
int right = 0;
int sum = 0;
//从左往右
for(int i=0;i<s.size();++i){
if(s[i]=='(') ++left;
else if(s[i]==')') ++right;
if(left==right) sum = max(sum,left+right);
if(right>left) left=right=0;
}
left=right=0;
//从右往左
for(int i=s.size()-1;i>=0;--i){
if(s[i]=='(') ++left;
else if(s[i]==')') ++right;
if(left==right) sum = max(sum,left+right);
if(right<left) left=right=0;
}
return sum;
}
};