最长有效括号(java)

题目 :给你一个只包含 '('')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
(()) , ()() 这两种情况都表示匹配

解题思路:运用动态规划,需要考虑的情况有以下几种:

  • 字符 ’ ( ’ 的dp值一定是0

    而对于’)’ 则要分情况进行讨论:因为是要讨论s[i-1]的情况所以i需要从1开始

  • 当s[i-1]==’ ( ’ 时,dp[i]=dp[i-2]+2;//但是这里需要注意的是,如果i等于1的情况即’()'时,i-2就越界了,所以i必须大于等于2,当大于2时,转移方程为:dp[i] = dp[i-2]+2,否则dp[i]=2,对应于()这种情况;

  • 当s[i-1]==’ ) ’ 时,这个情况就有点复杂,首先要判断i-dp[i-1]>0 ,即还有东西可以和他匹配,s[i-dp[i-1]-1]是否为’(’ ,否则dp[i]为0.

  • 然后判断 i-dp[i-1] 是否是大于 2 ,大于2时,说明前面还有例如()(()()),小于2时例如(()()) ,前一种情况dp[i]=dp[i-1]+dp[i-dp[i-1]-2] +2 , 后一种情况dp[i]=dp[i-1]+2;

  • 在循环判别的过程中取dp的最大值即可。

代码如下:

class Solution {
    public int longestValidParentheses(String s) {
        int length=s.length();
        int [] dp=new int[length];
        char[] list=s.toCharArray();
        int rs=0;
        for(int i=1;i<length;i++){
            if(list[i]==')'){
                if(list[i-1]=='('){
                  dp[i]= (i>=2 ? dp[i-2]:0) +2;
                }else if(i-dp[i-1]>0&&list[i-dp[i-1]-1]=='('){
                  dp[i]=dp[i-1]+(i-dp[i-1]>=2?dp[i-dp[i-1]-2]:0)+2;
                }
            }
            rs=Math.max(rs,dp[i]);
        }
        return rs;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值