LeetCode32 题最长有效括号

这篇文章描述了一种解决编程问题的方法,即给定一个只包含(和)的字符串,找到最长的有效括号子串的长度。通过使用栈数据结构,当遇到(时入栈,遇到)时与栈顶元素匹配,若匹配成功则更新有效括号子串的长度。分别提供了Java和Python的代码实现,最后计算数组的最大连续累加和得到答案。
摘要由CSDN通过智能技术生成

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 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_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值