刷题小记 (8) LeetCode 20 有效的括号 (括号匹配问题&栈)

LeetCode 20

2020.8.14
今天的LeetCode每日一题

我的通过代码

class Solution {
    public boolean isValid(String s) {
        String[] xx = s.split("");
        Stack<String> st = new Stack<String>();
        boolean flag = true;
        for(int i=0;i<xx.length;i++) {
            if(xx[i].equals("(")||xx[i].equals("{")||xx[i].equals("[")) {
                st.push(xx[i]);
            }
            if(xx[i].equals(")")) {
                if(st.empty()) {
                    flag = false;
                    break;
                }
                if("(".equals(st.peek())) {
                    st.pop();
                } else {
                    flag = false;
                    break;
                }
            }
            if(xx[i].equals("}")) {
                if(st.empty()) {
                    flag = false;
                    break;
                }
                if("{".equals(st.peek())) {
                    st.pop();
                } else {
                    flag = false;
                    break;
                }
            }
            if(xx[i].equals("]")) {
                if(st.empty()) {
                    flag = false;
                    break;
                }
                if("[".equals(st.peek())) {
                    st.pop();
                } else {
                    flag = false;
                    break;
                }
            }
        }
        return flag&&st.empty();
    }
}

碰上的问题

大问题没有,但是我写的代码执行用时10ms,不够优秀,有很多地方可以改进。

1.

对于单一个左括号的情况,我通过检查栈是否为空来解决,可是对于单一个右括号的情况,我解决的太过繁琐。
其实,对于一个只有三种括号的字符串,括号全部匹配意味着这个字符串的字符都是两两对应的,即字符数量为偶数,那么只要在代码的一开始对这一点进行判断就可以处理掉最后剩下单边括号的情况,即:

	int n = s.length();
    if (n % 2 == 1) {
        return false;
    }

这样的确在开头筛掉了一些情况,但这样的执行时间仍旧不高。

2.

在这题的评论区,我看到了一些巧妙的思路,比如下面这个逆向思维:

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

在碰到左括号时,他选择将对应的右括号入栈,这样很好的处理掉了类似“)(”的情况,十分简洁,执行时间1ms。

3.

还看到一个有趣的思路,直接利用java字符串函数来解决

class Solution {
    public boolean isValid(String s) {
        while(s.contains("()")||s.contains("[]")||s.contains("{}")){
            if(s.contains("()")){
                s=s.replace("()","");
            }
            if(s.contains("{}")){
                s=s.replace("{}","");
            }
            if(s.contains("[]")){
                s=s.replace("[]","");
            }
        }
        return s.length()==0;
    }
}

很有意思,但是执行时间有点长,50+ms

你可能感兴趣的:(LeetCode笔记,leetcode,栈,java)