第二刷:
首先,此题可以用O(n)的空间做,就是第一遍标识所有匹配的位置,第二遍找最长连续的匹配就行了。那么改善一点就是记录上一个不匹配的位置就行了,上一个不匹配的位置有两种,一种是多余的')',这个用一个变量记录;另一个是'(',这个用栈记录。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> stk; // this stack stores all unmatched '(' positions
int lastRight = -1; // last unmatched ')' position
int longest = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
stk.push(i);
} else { // ')'
if (!stk.empty()) {
stk.pop();
if (!stk.empty()) {
longest = max(longest, i - stk.top());
} else {
longest = max(longest, i - lastRight);
}
} else { // no match
lastRight = i;
}
}
}
return longest;
}
};
第一刷:
此题有点难度。知道了:1.括号匹配的题目可以用stack;2.stack里面可以放括号的index;3.用一个last标记上一个失匹配的')‘,相当于重置;参考:http://discuss.leetcode.com/questions/212/longest-valid-parentheses
http://www.cnblogs.com/remlostime/archive/2012/11/25/2787878.html
#include <string>
#include <stack>
using namespace std;
class Solution {
public:
// (()())
// (()
// ()((()
int longestValidParentheses(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int max_len = 0;
int last = -1;
stack<int> lefts;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(')
{
lefts.push(i);
}
else //if (s[i] == ')' )
{
// no matching '('
if (lefts.empty()) {
last = i;
}
else
{
lefts.pop();
if (lefts.empty())
{
int len = i - last;
if (len > max_len) max_len = len;
}
else
{
int len = i - lefts.top();
if (len > max_len) max_len = len;
}
}
}
}
return max_len;
}
};