这道题是括号题,这种括号题如果是一种括号,就用一个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();
}