在文本编辑中,有必要检测一个字符串中的括号是否匹配。括号包含小括号(),中括号[ ],大括号{ },简单情况下是只包含这三种括号中的一种,可以提供一个计数器,当遇到左括号计数器值加一,遇到一个右括号,计数器值减一。遍历一遍字符串,最后计数器值为0,那么括号是匹配的,否则不匹配。但是,如果涉及两种以上的括号,这种办法就会失效。所以,选择用堆栈来辅助记录,当遇到左括号就压入栈中,当遇到右括号,弹出堆栈最上面的左括号,检测是否为同一类括号,如果相同则继续遍历,否则判断为不匹配。最后检测堆栈是否为空,如果为空,则匹配,否则不匹配。
public boolean isValid(String s) {
if(s.length() < 1 || s == null) {
return true;
}
if(s.length() % 2 != 0) {
return false;
}
Stack<Character> stack = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(map.containsKey(c)) {
char ch = stack.isEmpty() ? '#' : stack.pop();
if(ch != map.get(c)) {
return false;
}
}
else {
stack.add(c);
}
}
return stack.isEmpty();
}
时间复杂度:O(n)
空间复杂度:O(n)