32. 最长有效括号

32. 最长有效括号

题目

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:

输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

思路

这是一道动态规划题目,但是确实不好想。如果用暴力做法,需要O(N^3)的时间复杂度。
数组f[]表示状态数组,f[i]表示必须以第i个字符结尾的字符串,其中最长的有效括号长度(必须包含第i个字符)。如果第i个字符为’(’,那么以第i个字符结尾的字符串,最长的有效括号长度就是0,这是最简单的情况。
如果第i个字符为’)’,那么需要看i前面的字符。就是需要统计f[i-1]的长度,f[i-1]表示i-1个字符串结尾的最长有效括号的长度,设为l,那么如果第i-l-1个字符恰好为‘(’,说明此时从i-l-1位置到i位置正好是一个有效括号,但是此时还没结束,还需要统计f[i-l-1-1]的值,也就是第i-l-1个字符的前面那个字符j,以第j个字符结尾的最长有效括号的长度。
如果那么如果第i-l-1个字符恰好为‘)’,则第i-l-1个字符与第i个字符无法匹配。那么f[i]就是0。
时间复杂度为O(N)。非常巧妙

代码

    public int longestValidParentheses(String s) {
        int n = s.length();
        if(n==0){
            return 0;
        }

        int max_l = 0;
        int f[] = new int[n];
        f[0] =0 ;
        for(int i=1;i<n;i++){
            if(s.charAt(i)=='('){
                f[i] = 0;
            }else{
                int j = f[i-1]+1;
                if(i-j!=-1 && s.charAt(i-j)=='('){
                    f[i] = f[i-1] +2;
                    if(i-j>0){
                        f[i] = f[i]+f[i-j-1];
                    }
                }
                
            }

            max_l = Math.max(max_l,f[i]);
        }
        return max_l;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值