括号字符串的有效性和最长有效长度

【题目】
1.给定一个str,判断是不是整体有效的括号字符串
2.返回最长的有效括号字串长度

【示例】

    public static void main(String[] args) {
        String s="()";
        System.out.println(isValid(s));//true
        s="(()))";
        System.out.println(isValid(s));//false
        s="()a()";
        System.out.println(isValid(s));//false

        System.out.println(maxLength("(()())"));//6
    }

【代码】

//判断是否是有效的括号字符串
    public static boolean isValid(String str){
        if(str==null||str.equals("")){
            return false;
        }
        char[] chas=str.toCharArray();
        int status=0;
        for(int i=0;iif(chas[i]!='('&&chas[i]!=')'){
                return false;//如果遇到非括号字符,false
            }
            if(chas[i]=='('){
                status++;//记录此时(的个数
            }
            if(chas[i]==')' && --status<0){
                return false;//遇到一个)减一个(,如果不够减了,说明此时右括号多于左括号,false
            }
        }
        return status==0;//最后 左右括号数应该同,status应该刚好减成了0
    }

    //判断是否是有效的括号字符串进阶:返回最长有效字符串长度
        public static int maxLength(String str){
            if(str==null||str.equals("")){
                return 0;
            }
            char[] chas=str.toCharArray();
            int[] dp=new int[chas.length]; 
            int pre=0;//一个下标
            int res=0;//记录结果
            for(int i=1;iif(chas[i]==')'){
                    pre=i-dp[i-1]-1;
                    if(pre>=0 && chas[pre]=='('){//判断chas[pre]和chas[i]能不能配一对括号
                        dp[i]=dp[i-1]+2+(pre>0?dp[pre-1]:0);
                    }
                }
                res=Math.max(res, dp[i]);
            }
            return res;
        }

你可能感兴趣的:(每日一练,string)