题目描述
输入输出样例
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
题解
- 将左括号和右括号的对应关系存储进HashMap中
- 遍历字符串
- 如果是左括号,直接入栈
- 如果是右括号,从栈中弹出一个元素,比较是否匹配(通过map)
- 需要考虑栈为空的情况
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
// 将括号直接的对应关系存入map中
Map<Character,Character> map = new HashMap<Character, Character>();
map.put(']', '[');
map.put(')', '(');
map.put('}', '{');
char[] chs = s.toCharArray();
for(char ch:chs){
// 如果是右括号,从栈中弹出元素
if(map.containsKey(ch)){
if(stack.isEmpty())
return false;
char c = stack.pop();
if(c != map.get(ch))
return false;
}
// 左括号直接入栈
else{
stack.push(ch);
}
}
return stack.isEmpty();
}
}
比较简洁的代码
class Solution {
public boolean isValid(String s) {
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.empty()||c!=stack.pop())
return false;
}
return stack.empty();
}
}