Difficulty: Hard
Description
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
For “(()”, the longest valid parentheses substring is “()”, which has length = 2.
Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.
Solution
思路
自己的实现
- 找到
(
开头的字符,一直往下扫描; - 若
(
的数量多于或等于)
的数量,继续扫描(字符串直到目前合法); - 若
(
的数量少于)
的数量,说明不合法,记录之前合法字符串最大长度,回到第1步。
自己的实现有个缺点:扫描到末尾,要从末尾往回再扫描一部分,因为要处理类似(()
的情况。
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.length();
int i = 0, j = -1, max = 0, left = 1, right = 0;
for (; i < len && j < len;) {
i = j + 1;
// 找到'('开头
for (; i < len && s[i] == ')'; ++i) {}
if (i < len) {
for (j = i + 1; j < len; ++j) {
if (s[j] == '(') ++left;
else ++right;
if (left < right) {
max = (max < j - i) ? j - i : max;
left = 1;
right = 0;
break;
}
}
}
}
// 处理最后的一串括号
--j;
while (j > i) {
for (; j > i && s[j] == '('; --j) {}
if (j > i) {
for (right = 0, left = 0; j >= i; --j) {
if (s[j] == ')') right++;
else left++;
if (left > right) break;
}
}
max = (max < 2 * right) ? 2 * right : max;
}
return max;
}
};
更好的实现
使用栈,把字符所属的下标一个一个压入栈,若先后压入的下标分别代表(
和)
,则弹出这两个下标,目前下标减去栈顶的下标,则是目前的maxLength
。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int>stackk;
int maxLength = 0;
//(()
stackk.push(-1);
for (int i = 0; i < s.size(); ++i) {
int t = stackk.top();
if (t != -1 && s[i] == ')' && s[t] == '(') {
stackk.pop();
maxLength = max(maxLength, i - stackk.top());
}
else {
stackk.push(i);
}
}
return maxLength;
}
int max(int a, int b) {
if (a < b) return b;
return a;
}
};