Leetcode 32 最长有效括号

题目

代码分析

可以使用栈,暴力的方式来解题
最好使用动态规划,dp[i]表示以str[i]为结尾的最长的有效括号,状态转移方程如下
case 1: .........()

如果当前是(,上一个位置是)

case 2: .........))

dp[i]=dp[i-1]+2+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0);

注意三元运算符的括号

代码总结

/*
    枚举法判断有效的括号数量
     */
    public static int longestValidParentheses3(String s)
    {
        int res=0;
        for(int i=0;i<s.length();i++)
            for(int j=i+2;j<s.length()+1;j+=2)
            {
                if(isValid(s.substring(i,j)))
                {
                   System.out.println(i+" "+j);
                   res=Math.max(res,j-i);
                   System.out.println(res);
                }
            }
        return res;
    }
    /*
    括号是否合法
    )()())
     */
    public static boolean isValid(String s)
    {
        char[] chas = s.toCharArray();
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<chas.length;i++)
        {
            if(chas[i]=='(')
            {
                stack.push('(');
            }
            else if(chas[i]==')'&&!stack.isEmpty()&&stack.peek()=='(')
            {
                stack.pop();
            }else
            {
                return false;
            }
        }
        return stack.isEmpty();
    }
 public int longestValidParentheses(String s) {
        char[] chas=s.toCharArray();
        int[] dp=new int[s.length()];
        int max=0;
        for(int i=1;i<s.length();i++)
        {
            if(chas[i]==')')
            {
                if(chas[i-1]=='(')
                {
                     dp[i]=(i-2>=0?dp[i-2]:0)+2;
                }else if(i-dp[i-1]-1>=0&&chas[i-dp[i-1]-1]=='(')
                {
                    dp[i]=dp[i-1]+2+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0);
                }
            }
            max=Math.max(max,dp[i]);
        }

        return max;
    }

学习情况

1次

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务