题目描述:
图片来源于LeetCode题目描述。
解法:
解法一,自己写出的最常规的解法:
class Solution {
public boolean isValid(String s) {
// 自己的解法1,很传统。不够巧妙。
// 時間慢的問題在於沒有在中間發現有問題時直接返回false,而依然走遍了整個串。
//
// 這個條件和最後的判斷條件重複了,乾脆不要了。
// if(s.length()==0){
// // return false; //题目要求這時候返回true
// return true;
// }
char[] a=s.toCharArray();
if(s.length()%2==1){
return false;
}
Stack<Character> stack=new Stack();
for(int i=0;i<s.length();i++){
if(stack.empty()){
stack.push(a[i]);
}
// 调用peek时,若此时栈底为空就会返回EmptyStackException异常,要注意下细节。
else if(stack.peek()=='{'&&a[i]=='}'){
stack.pop();
}else if(stack.peek()=='['&&a[i]==']'){
stack.pop();
}else if(stack.peek()=='('&&a[i]==')'){
stack.pop();
}else{
stack.push(a[i]);
}
}
if(stack.empty()){
return true;
}else return false;
}
}
解法二,官方解法,注意事项和优点都看注释。
class Solution {
public boolean isValid(String s) {
// 模仿官方解法,最大的好处就是在中间一发现右括号和栈顶的左括号不匹配直接返回false。
char[] a=s.toCharArray();
if(s.length()%2==1){
return false;
}
// 技巧在这里,注意Map的用法
Map<Character,Character> map=new HashMap();
map.put(')','(');
map.put('}','{');
map.put(']','[');
Stack<Character> stack=new Stack();
for(int i=0;i<s.length();i++){
// 下面这句排查了很久才发现错误!!!注意containsValue和containsKey的区别!!!!!!
// if(map.containsValue(a[i])){
if(map.containsKey(a[i])){
if(stack.empty()||stack.peek()!=map.get(a[i])){
return false;
}else{
stack.pop();
}
}else{
stack.push(a[i]);
}
}
return stack.empty();
}
}