力扣题20有效的括号

该博客讨论了如何使用Java解决LeetCode第20题——有效括号的问题。通过建立辅助数组模拟栈的方式检查括号匹配,优化点在于当括号数量为奇数时直接判断无效。同时对比了使用Java内置Stack类的解决方案。
摘要由CSDN通过智能技术生成

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

1.自己的代码:利用一个辅助数组来模拟,没有匹配的括号就进栈,匹配成功的括号就出栈。

class Solution {
    public boolean isValid(String s) {
        int index = 0;
        boolean isValid = true;
        char c = ' ';
        char[] chars = new char[s.length()];//创建一个辅助数组,类似栈的作用,存储每一个遍历到的字符
        int charIndex = 0;//辅助数组的起始下标

        while(index < s.length()){
            c = s.charAt(index);
            chars[charIndex++] = c;//将读到的字符存入辅助数组中
            if(c == ')'){//如果此时遇到的是')'
                if(charIndex == 1){//如果')'存在辅助数组中的第一个元素,说明错误
                    isValid = false;
                    break;
                }

                if(chars[charIndex - 2] == '('){//如果')'的前一个元素是'(',就说明配对成功,把下标回到出现这两个元素前
                    charIndex = charIndex - 2;
                }else{//前一个元素不是'(',说明错误
                    isValid = false;
                    break;
                }
            }
            //']'和'}'的情况与')'类似
            if(c == ']'){
                if(charIndex == 1){
                    isValid = false;
                    break;
                }
                if(chars[charIndex - 2] == '['){
                    charIndex = charIndex - 2;
                }else{
                    isValid = false;
                    break;
                }
            }

            if(c == '}'){
                if(charIndex == 1){
                    isValid = false;
                    break;
                }
                if(chars[charIndex - 2] == '{'){
                    charIndex = charIndex - 2;
                }else{
                    isValid = false;
                    break;
                }
            }

            index++;
        }
        //如果辅助数组的下标不是初始值0,说明存在括号没有被匹配,也出现错误
        if(charIndex != 0){
            isValid = false;
        }

        return isValid;
    }
}

   上面的代码可以改进的地方:只要数量是奇数就说明肯定是错误的,就不需要再判断第一个元素是不是')'、']'、'}'这三种中的一个。

2.答案解法:利用了java自带实现的stack。

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {//如果数量是奇数的话,那就肯定是错误的
            return false;
        }
        //利用一个Map存储配对情况
        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        //定义一个栈空间
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {//遍历每个字符
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {//如果是map中包含的字符,即三种右括号中的一种
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {//栈为空或者栈顶元素的相对应的括号不匹配,说明错误
                    return false;
                }
                stack.pop();//将匹配成功的出栈
            } else {//如果是三种左括号,就直接压栈
                stack.push(ch);
            }
        }
        return stack.isEmpty();//栈为空返回true,说明匹配成功;否则返回false,匹配不成功。
    }
}

题源:力扣

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值