LeetCode 32.最长有效括号

题目:

给你一个只包含 () 的字符串,找出最长有效格式正确且连续)括号子串的长度
注意:该最长有效括号一定要是连续的!

思路:

  1. 本题可以使用动态规划解决,首先创建一个数组dp[],用来保存当前位置的最长有效子串数量
  2. 首先明确有效子串的条件,当前位置的字符一定为),并且前面存在字符((Tips:不一定是紧挨着当前这个)的),如果当前位置的字符为(,那么该位置的dp值一定为0。
  3. 因此分两种小情况,在当前位置i字符为)时:
    1. 如果前一个字符s.charAt(i - 1)(,那么当前位置上dp[i]=dp[i - 2] + 2,也就是这一对有效子串之前的有效子串长度加上2
    2. 如果前一个字符s.charAt(i - 1)),那么就要对之前的值进行判断,首先:dp[i - 1]为前面有效子串的长度,拿当前位置减去前面有效子串的长度之后,如果找到了一个(,说明匹配到了,也就是s.charAt(i - dp[i - 1] - 1)(,然后再加上该有效子串前面位置的dp值再加当前位置匹配到的一对括号2,就是当前位置的dp值dp[i] = 2 + dp[i - 1] + dp[i - dp[i - 1] - 2]
    3. 每经过一个位置,就更新maxres的值,使它保持当前时刻的最大值

以下为代码+注释,结合代码会好理解一点:

	public int longestValidParentheses(String s) {
        // 动态规划
        // 设置一个变量保存整个字符串的最大有效括号长度
        int maxres = 0;
        int[] dp = new int[s.length()];
        // 从第二个字符开始遍历,一直到最后一个,每次都与前一个比较
        // 符合题目条件的情况一定是当前字符为')',前面包含'('
        // 如果当前字符为'(',那么它的dp值一定为0
        for(int i = 1; i < s.length(); i++){
            if(s.charAt(i) == ')'){
                // 1.如果前一个为'('
                if(s.charAt(i - 1) == '('){
                // 注意要判断索引是否越界
                    dp[i] = (i > 1 ? dp[i - 2] : 0) + 2;
                // 2.如果前一个不为'(',但是前面仍旧存在'(',注意判断索引是否越界
                }else if(i - dp[i - 1] >= 1 && s.charAt(i - dp[i - 1] - 1) == '('){
                    // 那么当前位置的dp值就等于2+前面一部分有效子串以及有效子串前面的有效串
                    dp[i] = 2 + dp[i - 1] + 
                    (i - dp[i - 1] - 2 >= 0 ? dp[i - dp[i - 1] - 2] : 0);
                }
            }
            maxres = Math.max(maxres, dp[i]);
        }
        return maxres;
    }

笔者也在不断学习,如有错误,欢迎指正!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值