力扣20题.有效的括号

e282abd253d87f3aa5e367ac0adee244.gif

业精于勤而荒于嬉,行成于思而毁于随

题目介绍


    相信每一位小伙伴都明白算法的重要性,以后我们一天一道力扣题,帮助我们更好的学习算法,也能帮助我们提升面试的成功率!

先来看一道力扣第二十题,是一道使用了栈这个数据结构的简单算法题:

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"

输出: true

示例 2:

输入: "()[]{}"

输出: true

示例 3:

输入: "(]"

输出: false

示例 4:

输入: "([)]"

输出: false

示例 5:

输入: "{[]}"

输出: true

相信大家读完题已经有了思路了吧,这里我给大家分享一下我的思路,其实非常简单,就是遇到了左括号,就入栈,遇到了右括号,就pop弹出一个左括号,然后进行比对,如果右括号是"}",弹出的左括号不是"{"就返回false,很简单吧?

09af50e797a27d8641de314f6e50b683.png

c11c440bf2f9240970e48320b697d562.png

当然还要考虑边界值和特殊情况,接下来大家请看源码:

import java.util.Stack;

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
//如果s是空直接返回true
        if (s.length() == 0 || s == "") {
            return true;
        }
//如果第一个字符是右括号绝对错了
        if (s.charAt(0) == '}' || s.charAt(0) == ')' || s.charAt(0) == ']') {
            return false;
        }
//遇到左括号就入栈,遇到右括号就pop一个进行比对
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '{' || s.charAt(i) == '(' || s.charAt(i) == '[') {
                stack.push(s.charAt(i));
            }else if (s.charAt(i) == '}' || s.charAt(i) == ')' || s.charAt(i) == ']') {
//如果栈内左括号都匹配完了还剩下右括号,返回false
                if (stack.empty() || s.charAt(i+1) != null || s.charAt(i+1) != "" ) {
                    return false;
                }
//如果左括号跟右括号不匹配直接返回false
                Character chr = stack.pop();
                if (chr == '{' && s.charAt(i) != '}' ||
                    chr == '(' && s.charAt(i) != ')'||
                    chr == '[' && s.charAt(i) != ']') {
                    return false;
                }
//其余奇葩行为都返回false
            }else
                return false;
        }
        if (!stack.empty()) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
        System.out.println(new Solution().isValid("[])"));
    }
}

a760d6e640827c31c88a960bc3996837.png

我的这个方法运行时间3ms,虽然慢一些但是比较容易理解,当然大家如果学有余力可以参考一下比较极客的写法(0ms):

class Solution {
    public boolean isValid(String s) {
        if(s.isEmpty()){
            return true;
        }
        char sArr[] = s.toCharArray();
        char stack[] = new char[sArr.length];
        int j = 0;
        for(int i = 0; i < sArr.length; i++){
            switch(sArr[i]){
                case '(':
                    stack[j] = '(';
                    j++;
                    break;
                case '{':
                    stack[j] = '{';
                    j++;
                    break;
                case '[':
                    stack[j] = '[';
                    j++;
                    break;
                case ')':
                    if(j-1 < 0){
                        return false;
                    }
                    if(stack[j-1] == '('){
                        stack[j-1] = '0';
                        j--;
                    } else {
                        return false;
                    }
                    break;
                case '}':
                    if(j-1 < 0){
                        return false;
                    }
                    if(stack[j-1] == '{'){
                        stack[j-1] = '0';
                        j--;
                    } else {
                        return false;
                    }
                    break;
                case ']':
                    if(j-1 < 0){
                        return false;
                    }
                    if(stack[j-1] == '['){
                        stack[j-1] = '0';
                        j--;
                    } else {
                        return false;
                    }
                    break;
            }
        }
        if(stack[0] == '0'){
            return true;
        }
        return false;
    }
}


下期我们来谈谈热门到爆炸的区块链到底是什么东西,我会用最容易理解的图文方式帮助大家理解区块链的含义和原理,下次见~

扫描二维码

获取更多精彩

Bean冷的心

f24da65b2c3abe8279445b87e0e4de5a.jpeg 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值