力扣20.有效的括号
力扣刷题 1

原题,题目描述:

32d4510b-0e1a-4b79-91a1-671f9cd619db.png

我们也是过渡到了栈的题,其实前面二分查找还有一个题没做🤡🤡🤡🤡。这道题比较简单,力扣分类也是简单题,不过你要是正常做,肯定拿不到百分百。

思路一

这种括号题第一个想到的就是栈,我们遇到前括号就放入栈,遇到后括号就将前括号弹出栈,然后一个个判断是不是有效括号即可。我们根据最朴素的想法直接写代码。

代码一

class Solution {
    public boolean isValid(String s) {
        int len = s.length();

        ArrayDeque<Character> deque = new ArrayDeque<>();

        for (int i = 0; i < len; ++i) {
            char c = s.charAt(i);
            if (deque.isEmpty()) {
                deque.add(c);
                continue;
            }
            if (c == ')') {
                Character last = deque.removeLast();
                if ('(' != last) {
                    return false;
                }
                continue;
            }else if (c==']'){
                Character last = deque.removeLast();
                if ('[' != last) {
                    return false;
                }
                continue;
            }else if (c=='}'){
                Character last = deque.removeLast();
                if ('{' != last) {
                    return false;
                }
                continue;
            }
    
    
            deque.addLast(c);
        }
  
        return deque.isEmpty();
    }
}

很朴素,也很高效,O(N)的时间复杂度,但是提交发现只打败了百分之80,说明我们的代码还有很多可以优化的点,我们来看:

思路二

我们这里使用的栈是Java的api,其实这个在Java中表示的并不是栈,而是双端队列,只是我们当栈使用。但是问题在于我们只需要用到这个对象一小部分功能,那我们可以自己实现针对题目的栈。这里我们循环内部的代码也写得比较冗余(当然可读性杠杠的),所以我们也顺手优化一下。并且括号当然是成对存在的,我们也可以在开头判断一下字符串的长度,看看是不是双数,如果是单数直接返回。

代码二

class Solution {
    public boolean isValid(String s) {
        int len = s.length();
        if ((len & 1) != 0)
            return false;
        char[] stack = s.toCharArray();
        int top = -1;

        for (int i = 0; i < len; ++i) {
            char c = stack[i];
            if (c == ')' || c == ']' || c == '}') {
                if (top == -1) {
                    return false;
                }
                char last = stack[top--];
                if (last != c - 2 && last != c - 1) {
                    return false;
                }
                continue;
            }
            stack[++top] = c;
        }

        return top == -1;
    }

}

上面的代码看起来清爽了许多,也快了不少,但是还是没有百分百,只有百分之99。

力扣20.有效的括号
https://www.than.pw/archives/019ca39b-05c9-762e-a7b7-09e764680e64
作者
than
发布于
更新于
许可