题目:
Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())
" Output: 4 Explanation: The longest valid parentheses substring is"()()"
代码:
class Solution {
public:
int longestValidParentheses(string s) {
int sum = 0, record = 0, count = 0, max1 = INT_MIN,max2=INT_MIN;
int len = s.length();
bool flag = false;
for (int i = 0; i < len; i++) {
if (s[i] == '(') {
sum++;
record++;
flag = true;
}
if (flag&&s[i] == ')') {
sum--;
if (sum == 0) {
count += record * 2;
record = 0;
}
if (sum < 0) {
max1 = max1 > count ? max1 : count;
count = 0;
sum=0;
flag = false;
}
}
}
max1 = max1 > count ? max1 : count;
sum = 0; record = 0; count = 0; flag = false;
for (int i = len - 1; i >= 0; i--) {
if (s[i] == ')') {
sum++;
record++;
flag = true;
}
if (flag&&s[i] == '(') {
sum--;
if (sum == 0) { count += record * 2; record = 0; }
if (sum < 0) {
max2 = max2 > count ? max2 : count;
count = 0;
sum=0;
flag = false;
}
}
}
max2 = max2 > count ? max2 : count;
return max1 > max2 ? max1 : max2;
}
};
思路:
1、用一个数字给左括号,右括号计数
往右走的时候左括号加右括号减,往左走记右括号加左括号减。
计数小于零的时候重置计数
一路下来记录最长的就完事了。
2、从向左方向和向右方向都需要遍历
3、值得注意的点:当计数小于0的时候要给它重置为0