算法之括号匹配中最长有效字符串

1. 题目

  • 任何一个左括号都能找到和其正确配对的右括号
  • 任何一个右括号都能找到和其正确配对的左括号

求最长的有效的括号长度

2. 解释

例如,这里的括号

((((()()()()()()()))()

最长有效是:((()()()()()()()))()

我们来求这个最长。

3. 思路

我们用一个数组来存从当前位置开始,往前N个字符的最长有效字符串。什么意思呢,举个例子:

		( ) ( ) ( ( ) ) (  )  (  )
	    1 2 3 4 5 6 7 8 9 10 11 12
存的数组:0 2 0 4 0 0 2 8 0 10 0  12

3,5等位置为什么为0,3位置是左括号,往前一个是右括号,组不成有效字符串,所以,直接就为0 。

在这里插入图片描述

4. 代码

public class Code03_ParenthesesDeep {

    public static int maxLength(String s){
        if(s == null || s.equals("")){
            return 0;
        }
        char[] str = s.toCharArray();
        int[] dp = new int[str.length];
        int pre = 0;
        int res = 0;
        for(int i = 1; i < str.length; i++){
            if(str[i] == ')'){
                pre = i - dp[i - 1] - 1;
                if(pre >= 0 && str[pre] == '('){
                    dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
                }
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }

    public static void main(String[] args) {
        String s = "(()()";
        System.out.println(maxLength(s));
    }
}

运行结果:

4

5. 总结

这里使用了一个动态规划,跟前面的位置进行匹配。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值