这道题是括号题,这种括号题如果是一种括号,就用一个int做stack就行,但是如果是多种括号,用int就烦琐了,一定要用Stack,下面是我的算法,时间复杂度就是O(n).

我把每类括号的做括号和右括号放在map中,如果是左括号就push到stack,如果是右括号,就pop stack,map中对应的value是不是pop出来的值,如果不是就return false。

这里需要注意两点:

1. 每次pop之前要先判断stk是否为空,如果stack为空,说明有多余的右口号

2. 最后要check一下stack是否为空,如果stack不空,说明有多余的左括号

    public boolean isValid(String s) {
        Map<Character, Character> map = new HashMap<>();
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
        Stack<Character> stk = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '[' || c == '{') {
                stk.push(c);
            } else {
                if (stk.isEmpty() || stk.pop() != map.get(c))
                    return false;
            }
        }
        return stk.isEmpty();
    }

 

下面是网友省掉map的算法,可以省掉一些内存空间:

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() || stack.pop() != c)
            return false;
    }
    return stack.isEmpty();
}

 

posted on 2022-02-02 01:11  阳光明媚的菲越  阅读(30)  评论(0编辑  收藏  举报