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

Posted MR.SEEEKS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ();


以上是关于LeetCode20. 有效的括号。找对象的故事的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-20.有效的括号

LeetCode 20. 有效的括号

LeetCode - 20 :有效的括号

python刷LeetCode:20. 有效的括号

LeetCode 20. 有效的括号(Valid Parentheses)

leetcode-20-有效的括号