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"()()"
方法一:栈的应用
lastpos记录该子串开始的位置
当遇到‘(’ :直接将下标压入栈
遇到‘)’:
①若此时栈空:不能构成有效串,直接更新lastpos
②栈不空:这里又要分为
(1):栈中只有一个‘(’ 可以匹配:此时子串的长度为当前位置 - lastpos
(2):不止一个‘(’ :此时子串的长度为当前位置 - 与其匹配的‘(’ 的下标
C++
class Solution {
public:
int longestValidParentheses(string s) {
stack<int>temp;
int ans = 0, lastpos = 0;
for(int i = 0; i < s.length(); ++ i){
if(s[i] == '(')
temp.push(i);
else{
if(temp.empty())
lastpos = i + 1;
else{
temp.pop();
if(temp.empty())
ans = max(ans, i - lastpos + 1);
else
ans = max(ans, i - temp.top());
}
}
}
return ans;
}
};
Python
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
temp, ans, lastpos = [], 0, 0
for i in range(len(s)):
if s[i] == '(':
temp.append(i);
else:
if not temp:
lastpos = i+1;
else:
del temp[-1]
if not temp:
ans = max(ans, i - lastpos + 1);
else:
ans = max(ans, i - temp[-1]);
return ans
方法二:动态规划
dp[i]表示以当前位置为终点的最长有效长度。如果s[i-1-dp[i-1]]=='(',则说明当前位置可以和i-1-dp[i-1]位置匹配,dp[i]=dp[i-1]+2,然后还要加上匹配位置之前的最长长度dp[i]+=dp[i-dp[i]]。
C++
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.length(), ans = 0;
if(len == 0)
return 0;
vector<int>dp(len, 0);
for(int i = 1; i < len; ++ i){
if(s[i] == ')'){
if(i - dp[i-1] >= 1 && s[i - dp[i-1] -1] == '(')
dp[i] = dp[i-1] + 2;
}
if(i - dp[i] >= 0)
dp[i] += dp[i - dp[i]];
ans = max(ans, dp[i]);
}
return ans;
}
};
Python
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
dp, ans = [0 for i in range(len(s))], 0
for i in range(1, len(s)):
if s[i] == ')':
if i - dp[i-1] >= 1 and s[i - dp[i-1]-1] == '(':
dp[i] = dp[i-1] + 2
if i - dp[i] >= 0:
dp[i] += dp[i-dp[i]];
ans = max(ans, dp[i])
return ans