每日一题--->20. 有效的括号

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true
示例 2:

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

输入:s = "(]"
输出:false
示例 4:

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

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

提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

这道题我跟题解区想的一样,哈哈哈。

        一个左括号要用对应的右括号来进行抵消,而且最先抵消的左括号是已经出现的最后的一个左括号,这么一想那不就是用栈就行了。创建一个栈来存储出现的左括号。如果出现右括号的话,如果栈空就直接return false;如果栈不空的话就从栈pop一个左括号,如果这连个括号刚好是一对,那就继续向后遍历字符串,然后就重复上述操作。我是给每一个符号设置了一个数字值,对应成对的括号的数字值和为零,然后然后栈中储存的也是字符的数字值。

        代码如下:

 public static boolean isValid(String s) {
        //创建栈
        char ch[]=s.toCharArray();
        int sum1=0,sum2=0,sum3=0;
        int i=0;
        Stack<Integer> integers = new Stack<>();
        while(i<ch.length){
            if(getNum(ch[i])>0){
                integers.add(getNum(ch[i]));
            }
            else{
                //如果栈空直接返回false
                if(integers.empty())
                    return false;
                //如果栈不空判断是否可以成对
                if(integers.pop()+getNum(ch[i])!=0)
                    return false;
            }
            i++;
        }
        if(integers.empty())
            return true;
        return false;
    }
    //获取数字值
    public static int getNum(char ch){
        if(ch=='[')
            return 1;
        if(ch=='(')
            return 2;
        if(ch=='{')
            return 3;
        if(ch==']')
            return -1;
        if(ch==')')
            return -2;
        return -3;
    }

另外一个小知识,假如一个字符串只有“["和"]”组成,然后判断该字符串是否有效。

代码如下:

public boolean valid(char arr[]){
        int sum=0;
        int pos=0;
        while(pos<arr.length){
            if(arr[pos]=='('){
                sum++;
            }else{
                sum--;
            }
            if(sum<0){
                return false;
            }
            pos++;
        }
        if(sum>0){
            return false;
        }
        return true;
    }

        

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值