LeetCode20. 有效的括号。找对象的故事

题目信息

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

有效字符串需满足:

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

示例1:

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

示例2:

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

示例3:

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

示例4:

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

解题思路

题目的意思我给大家翻译翻译:
把括号之间的匹配想象成找对象,左括号(不管它是大括号还是小括号)看成是女生,右括号看成是男生,因为男生需要主动去匹配左括号。而找对象还要讲究看对眼、有感觉。还要找离自己最近的,没有对象的女生(未匹配的左括号)。如果恰好右括号匹配了一个左括号,那么他们就算是成了,轮到下一个男生。直到所有男生都找完了。这时候如果还有剩下的人,不管是男是女。都是剩下了,就不够皆大欢喜。需要返回false。如果没有剩下的,每个人都找到自己的心上人了,那就返回true。

还有一种情况,就是上面的示例4,')'离得最近的左括号是'['。
这个男生喜欢的是黑长直,但是他最近的女生是短发。
这哥们心态炸了,不谈了,心一横,
那就都别谈了。就要返回false了。

我们来看看ASCII码对照表,发现括号的ASCII值要么是相差1,要么是相差2.这个信息后面会用到。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体到代码上,可以用栈来解决。遍历题目给的字符串,如果是左括号(女生)那就放到栈里,如果是右括号,那就是男生了。看看和栈顶的括号匹配不,如果匹配了那就弹出出栈当前栈顶的元素,如果不匹配就返回false。到最后查看栈是不是空的,如果是空的就皆大欢喜,返回true,不为空的话就返回false。回到上面ASCII表中,如果两个括号能匹配,那么他们的ASCII相差一定不大于2。知道这些就可以写代码了。


实现代码:

class Solution {
    public boolean isValid(String s) {
    Stack<Character> stack=new Stack<> ();
        for(int i=0;i<s.length ();i++){
            char ch=s.charAt (i);
            if(ch=='(' || ch=='{' || ch=='['){
                stack.add (ch);
            }else {
                if(!stack.empty () && Math.abs (stack.peek ()-ch)<=2){
                    stack.pop ();
                }else {
                    return  false;
                }
            }
        }
        return  stack.isEmpty ();
}
}
  • 39
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

见闻色霸气~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值