一、题目描述
示例:
二、解题思路
本题括号排序特点正好与栈后进先出的特性一致。
即若遇到左括号,push(T)入栈;遇到右括号时将对应栈顶左括号pop出栈,可以建立一个HashMap来判断弹出的括号是否与右括号相对应。
在这样的规则下,如果字符串中的括号是按顺序闭合的,遍历完字符串之后,栈应该是空的。
注意, 考虑到给定的字符串并不一定是按顺序闭合的,很可能在运行过程中会出现在空栈的时候运行pop()方法,会抛出异常。因此在栈中先放入一个初始的Character,例如‘?’。并且在HashMap中也为‘?’放入相应的键值对。
三、自写代码
class Solution {
private HashMap<Character,Character> map = new HashMap<>();
public boolean isValid(String s) {
//空字符串
if (s.isEmpty())
return true;
//常数为奇数,肯定无法闭合
if (s.length() % 2 != 0)
return false;
//init hashmap
map.clear();
map.put('(',')');
map.put('{','}');
map.put('[',']');
//pop了‘?’的时候,如果不把这个键值对放进去会空指针异常
map.put('?','?');
Stack<Character> stack = new Stack<>();
//压入一个‘?’,防止pop()因为空栈而报错
stack.push('?');
for(char c : s.toCharArray()){
if(map.containsKey(c))
stack.push(c);
else if(map.get(stack.pop()) != c)
return false;
}
//遍历完成,若正确闭合,栈中应该只剩一个?
return stack.size() == 1;
}
}
四、结果分析
时间复杂度 O(N)。
空间复杂度 O(N):哈希表和栈使用线性的空间大小。
运行时间较快,而占用内存较大。这是因为用到了HashMap,HashMap是一种 用空间换时间 的思维方式。