算法学习(二)递归求解字符括号匹配问题

描述

给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

数据范围:字符串长度 0\le n \le 100000≤n≤10000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

我的解法:

        在递归字符串的过程中,采用stack保存当前字符,每一次递归将字符与集合最后一个元素进行匹配,如果匹配成功,则清除最后一个元素或添加当前元素,进入下一次递归,最后保证集合为空,说明字符串合法

Stack<String>stack = new Stack<>();
    public boolean isValid (String s) {
        int index = 0;
        return a(index, s);
    }
    public boolean a(int index, String s) {
        if(index==s.length()){//最后判断
            return stack.size()>0?false:true;
        }
        String value = s.charAt(index) + "";
        if (stack.size() <= 0) {
            if (value.equals("(") || value.equals("{") || value.equals("[")) {
                stack.push(value);
            }else
                return false;
        } else {
            if (value.equals("(") || value.equals("{") || value.equals("[")) {
                stack.push(value);
            } else {
                if (value.equals(")")) {
                    if (stack.peek().equals("(")) {
                        stack.pop();
                    } else {
                        return false;
                    }
                } else if (value.equals("]")) {
                    if (stack.peek().equals("[")) {
                        stack.pop();
                    } else {
                        return false;
                    }
                } else {
                    if (stack.peek().equals("{")) {
                        stack.pop();
                    } else {
                        return false;
                    }
                }
            }
        }
        return a(index+1,s);

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值