0
点赞
收藏
分享

微信扫一扫

【LeetCode刷题】20 有效的括号

鲤鱼打个滚 2022-04-07 阅读 92

题目

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

有效字符串需满足:

示例

方法一:不用HashMap

利用栈解决括号匹配问题,其实就是如果遇到左括号,就将其入栈,如果是右括号就与栈顶元素比较 (ch为 stack.pop(),同时弹栈),如果可以匹配的上,比如此时字符是 ),栈顶元素是 ( ,就匹配成功。如果不匹配就false,最后可以返回 stack.empty()。

这里的话,稍微变通了一下,遇到左括号,我把相应的右括号入栈。则如果遍历的元素是右括号只要与栈顶元素相比,看看是不是一样就行。其实本质上都是一样的操作(只是少了左右括号相匹配的过程,改成了遍历的元素与栈顶元素是否相等)

class Solution {
    public boolean isValid(String s) {
        if(s.isEmpty())
            return true;
        for(char c:s.toCharArray()){
            if(c=='(')
                stack.push(')');
            else if(c=='{')
                stack.push('}');
            else if(c=='[')
                stack.push(']');
            else if(stack.empty()||c!=stack.pop())
                return false;
        }
        if(stack.empty())
            return true;
        return false;
    }
}

 

方法二:使用HashMap

HashMap中,key为左括号,value为右括号。

遍历的同时,转换成字符类型,遇到左括号,入栈,否则就弹栈一个元素,查看map中它的value是否为将要遍历的字符ch(也就是右括号)

这里有一个细节,是我们提前将栈中压入一个 '?'字符,是因为防止出现 "(){}}{" 这种情况,会导致java.util.EmptyStackException,也就是空栈的时候还让他弹栈。这样子的话,整个遍历完,就不是返回栈是否为空了,而是栈顶元素是否为‘ ?’

class Solution {
    public boolean isValid(String s) {
        Map<Character,Character> map = new HashMap<>();
        map.put('{','}');
        map.put('(',')');
        map.put('[',']');
        Stack<Character> stack=new Stack<Character>();
        if(s.length()>0 && !map.containsKey(s.charAt(0)))
            return false;
        stack.push('?');
        for(Character ch : s.toCharArray()){
            if(map.containsKey(ch)){     
                stack.push(ch);
            }else if(map.get(stack.pop())!=ch){
                return false;
            }
        }
        return stack.pop()=='?';
    }
}

 

举报

相关推荐

0 条评论