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 "()()"
解法一:用栈stack
class Solution {
public:
int longestValidParentheses(string s) {
int max_len = 0,last = -1; //the position of the last ')'
stack<int> lefts; //keep track of the positions of non-matching '('s
for(int i=0; i<s.size();++i){
if(s[i]=='(')
lefts.push(i);
else
{
if(lefts.empty()) // no matching left
last=i;
else // find a matching pair
{
lefts.pop();
max_len=lefts.empty()? max(max_len,i-last) : max(max_len,i-lefts.top());
}
}
}
return max_len;
}
};
解法二:动态规划DP
// LeetCode, Longest Valid Parenthese
// 时间复杂度 O(n),空间复杂度 O(n)
// @author 一只杰森 (http://weibo.com/wjson)
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> f(s.size(), 0);
int ret = 0;
for (int i = s.size() - 2; i >= 0; --i) {
int match = i + f[i + 1] + 1;
// case: "((...))"
if (s[i] == '(' && match < s.size() && s[match] == ')') {
f[i] = f[i + 1] + 2;
// if a valid sequence exist afterwards "((...))()"
if (match + 1 < s.size()) f[i] += f[match + 1];
}
ret = max(ret, f[i]);
}
return ret;
}
};