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

290 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」 @TOC

题目信息

给定一个只包括 '('')''{''}''['']' 的字符串 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 ();
}
}