LeetCode第20题——有效括号

题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

看题解前自己的解决方案

思路

  • 利用栈先进后出的特性来解决该问题
  • 按字符逐个读取字符串,若是左括号就入栈,右括号就判断是否与在栈顶的左括号匹配,匹配的话就将栈顶左括号出栈,不匹配直接返回false,当将输入字符串遍历完时,若栈为空那么返回true,否则返回false
  • 返回false的情况
    • 1.左右括号不匹配
    • 2.右括号入栈时栈为空
    • 3.字符串遍历完后栈不为空

代码及其结果:

class Solution {
        public int checkType(Character ch){// 判断输入字符是属于左括号还是右括号
        if (ch.equals('(')|| ch.equals('[')||ch.equals('{'))
            return 0;
        else
            return 1;
    }
    public boolean checkOk(Character c1,Character c2){ // 检测左右括号是否匹配
        return c1.equals('(')&&c2.equals(')') || c1.equals('[')&&c2.equals(']')|| c1.equals('{')&& c2.equals('}');
    }
    public boolean isValid(String s) {
         Stack<Character> stack = new Stack<>();
        int len = s.length();
        char ch;
        for (int i=0;i<len;i++){
             ch = s.substring(i, i + 1).charAt(0);
             if (checkType(ch)==0){
                 stack.push(ch);
             }else{ // 若右括号入栈时栈为空 直接返回false
                 if (stack.size() == 0)
                     return false;
                 if (checkOk(stack.peek(),ch)){
                     stack.pop();
                 }else
                    return false;
             }
        }
        // 若字符串遍历完 还有元素在栈内 那么则代表字符串不正确
        return stack.isEmpty();
    }
}

在这里插入图片描述

看题解后优化的代码

优化思路

  • 相比于我之前的代码,该代码优化了判断字符左右类型和判断左右括号是否匹配的代码
  • 在读取字符时,若是左括号字符,直接入栈对应的右括号字符,若读取的是右括号字符,判断栈空和字符与栈顶字符是否相等,满足则返回false
class Solution {
    public boolean isValid(String s) {
        Stack<Character>stack = new Stack<Character>();
        for(char c: s.toCharArray()){
            if(c=='(')stack.push(')');
            else if(c=='[')stack.push(']');
            else if(c=='{')stack.push('}');
            else if(stack.isEmpty()||c!=stack.pop())return false;
        }
        return stack.isEmpty();
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值