题目地址:有效的括号
这道题第一反应就是使用栈,遇到左括号压栈,遇到右括号取栈顶元素看是否匹配,若匹配将栈顶元素出栈继续匹配,若不匹配直接返回false。我写了一个比较粗暴的方法:
class Solution {
public boolean isValid(String s) {
Stack<Character> chs = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c=='('||c=='['||c=='{')
chs.push(c);
else{
char topElement = chs.empty()?'#':chs.pop();
if (c==')'&&topElement!='(')
return false;
else if(c==']'&&topElement!='[')
return false;
else if (c=='}'&&topElement!='{'){
return false;
}
}
}
return chs.isEmpty();
}
}
结果:
看到官方的答案用了集合HashMap,感觉比较妙,用右括号作为键,左括号作为值:
class Solution {
private HashMap<Character, Character> mappings;
// 集合初始化,键存储右括号,值存储左括号
public Solution() {
this.mappings = new HashMap<Character, Character>();
this.mappings.put(')', '(');
this.mappings.put('}', '{');
this.mappings.put(']', '[');
}
public boolean isValid(String s) {
// 初始化一个Java内置的栈
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 如果是右括号
if (this.mappings.containsKey(c)) {
// 取栈顶元素,若栈顶为空,给个'#'元素
char topElement = stack.empty() ? '#' : stack.pop();
// 如果不匹配直接返回false
if (topElement != this.mappings.get(c)) {
return false;
}
} else {
// 如果是左括号,就直接压栈
stack.push(c);
}
}
// 如果栈不为空,则不匹配
return stack.isEmpty();
}
}
结果:
还有提升的。