leecode20——括号匹配

这篇博客探讨了如何检查字符串中括号的有效性,特别是处理奇数个数的情况。作者首先尝试使用栈来匹配左括号和右括号,然后注意到可以利用HashMap来优化解决方案。官方解答利用HashMap存储括号配对,遍历字符串时检查括号匹配,并通过栈来跟踪左括号。最终,当所有括号都匹配时,栈应为空。博客重点讨论了括号匹配的算法实现和奇数个数的特殊情况处理。

开始思路:

for循环每个字符

左括号 入栈  右括号匹配

要注意的是 当个数为奇数的时候

我的处理是:

class Solution {
    public boolean isValid(String s) {
        //()  ()[]{}——————如果匹配  那么相邻的两个左括号和右括号  一定匹配
        //([)]  最右边的左括号[ 和其最近的右括号 一定匹配 否则不正确

        //要考虑到奇数个数的情况
        Stack<Character> t=new Stack<>();
        boolean res=true;
        for(int i=0;i<s.length();i++){

            switch(s.charAt(i)){
                case ')':
                    if(!t.empty()&&'(' == t.pop()) {
                        break;
                    }else{
                        return false;
                    }
                case ']':
                    if(!t.empty()&&'[' == t.pop()) {
                        break;
                    }else{
                        return false;
                    }
                case '}':
                    if(!t.empty()&&'{' == t.pop()) {
                     break; 
                    }else{
                        return false;
                    }
                default:
                    t.push(s.charAt(i));
                    if(i==s.length()-1&&(i+1)%2!=0){//要考虑到奇数个数的情况  连续多个左括号
                        res=false;
                    }
                    break;
            }
        }
        return res;
    }
}

但如果处理奇数  奇数肯定不匹配 可以在开头就加上一个判断语句

前面通过率不高:

看了一下评论区  瞥到了hashmap

那就试试:

我试不出来、、、、、、

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {
            return false;
        }
        //官方解答 :果然巧妙
        //][  括号逆序如hashmap  如下   
        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};

        //然后依次判断   如果是[{(   左括号  那么依次入栈
        //如果是右括号 )]} 判断  栈是不是为空————栈空  此右括号无法匹配
        //判断栈的最上面一个s.peek()是否等于此右括号 在哈希表中的V值  如果不等————不匹配

        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                    return false;//不匹配直接弹出去
                }
                stack.pop();//()   栈 只入左括号     只弹左括号
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}

知识点:

java中 Stack定义:

Stack<> s=new Stack<>();

stack是栈 除了 pop push等函数之外  还提供了一个peek()   即查看最顶部一个元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值