给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
解题思路
1、看一个比较复杂的例子,我们可以知道如下的括号串的理论上最长有效串是标红部分,也就是长度为8
2、我们准备一个空栈,遇到(就压榨,遇到)就弹出,弹出的时候该位置和被弹出的位置全部标成1,这些位置是有效括号的位置
3、计算数组的最大连续的累加和即为最终答案。
java实现
class Solution {
public int longestValidParentheses(String s) {
if(s.length()<=1){
return 0;
}
Stack<Integer> stack = new Stack<>();
char[] chars = s.toCharArray();
int[] dp = new int[s.length()];
int max_ = 0;
for(int i=0; i<chars.length; i++){
if(chars[i]=='('){
stack.push(i);
}else if(!stack.isEmpty()&&chars[i]==')'){
int pop = stack.pop();
dp[pop] = 1;
dp[i] = 1;
}
}
max_ = dp[0];
for(int i=1; i<dp.length; i++){
if(dp[i]==1){
dp[i] = dp[i-1] + 1;
}else{
dp[i] = 0;
}
max_ = Math.max(max_, dp[i]);
}
return max_;
}
}
python实现
class Solution(object):
def longestValidParentheses(self, s):
"""
:type s: str
:rtype: int
"""
if len(s) <= 1:
return 0
stack = []
dp = [0 for _ in range(len(s))]
for i in range(len(s)):
if s[i] == '(':
stack.append(i)
elif len(stack) > 0 and s[i] == ')':
pop = stack.pop()
dp[pop] = 1
dp[i] = 1
max_ = dp[0]
for i in range(1, len(s)):
if dp[i] == 1:
dp[i] = dp[i-1] + 1
else:
dp[i] = 0
max_ = max(max_, dp[i])
return max_