有效括号的两种思路

本文介绍了两种判断字符串是否为有效括号的方法:一种是通过替换成对的括号来简化字符串,最后检查是否为空;另一种是使用栈结构,逐个检查字符并匹配相应的括号。文章详细解释了每种方法的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
一、数组
1、空字符串可被认为是有效字符串,单独判断
3、字符串的长度必须为偶数,否则不是有效括号
2、利用替换的思想
(1)如果() [] {} 成对出现,用”“替换,相当于删除
(2)剩下的,如果有成对的,继续替换
(3)重复length/2次后,用isEmpty()判断。为空,是有效字段
否则,不是有效字段

public static boolean isValid(String s) {
    //创建Stack对象
    //Stack<Character> stack = new Stack<Character>();
    int count=0;
    int length=s.length();
    //当s的长度为偶数(0和其他偶数)时,才有可能为有效括号
    if(length%2==0){
        if(s.isEmpty())
            return true;
        else{
            /*对s进行替换,将成对的(){} [] 替换成"",其实就是把它们从数组中删除;
            * 如果满足条件,继续进行替换,知道循环结束*/
            while (count<length/2){
                s=s.replace("()","").replace("{}","").replace("[]","");
                count++;
            }
            //如果替换后,s的长度还大于0,意味着存在着不成对的括号无法替换,这时,不是有效括号
            if(s.length()>0)
                return false;
            return true;
        }
    }
    return false;
}

二、栈
1、空字符串可被认为是有效字符串,单独判断
2、首先,利用chatAt()将字符串传入栈stack中
3、利用for循环,一个字节一个字节逐个判断
(1)若第一个为 ( [ } 其中一个,利用push()传入到stack1中
(2)若第二个字节为或者stack.peek()为配对的 ) ] } ,stack1.pop()
(3)继续判断
4、若为有效括号,stack1为空;否则,不为空

public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<Character>();
        Stack<Character> stack1 = new Stack<Character>();
        //将s中的字符传入栈中

    for (int i = 0; i < s.length(); i++) {
        stack.push(s.charAt(i));
    }
    if(s.isEmpty()){
        return true;
    }
    else{
        for (int i = 0; i < s.length()-1; i++) {
            char c = s.charAt(i);
            char c1= s.charAt(i+1);
            if (c == '(' || c == '[' || c == '{') {
                stack1.push(c);
                if (c == '(' && ( stack.peek() == ')' || c1==')' ) ){
                    stack1.pop();
                }
                if (c == '[' && (stack.peek() == ']' || c1==']' )){
                    stack1.pop();
                }
                if (c == '{' && (stack.peek() == '}'  || c1=='}' )){
                    stack1.pop();
                }
            }
        }
        return stack1.isEmpty();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值