题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
示例
方法一:不用HashMap
利用栈解决括号匹配问题,其实就是如果遇到左括号,就将其入栈,如果是右括号就与栈顶元素比较 (ch为 stack.pop(),同时弹栈),如果可以匹配的上,比如此时字符是 ),栈顶元素是 ( ,就匹配成功。如果不匹配就false,最后可以返回 stack.empty()。
这里的话,稍微变通了一下,遇到左括号,我把相应的右括号入栈。则如果遍历的元素是右括号只要与栈顶元素相比,看看是不是一样就行。其实本质上都是一样的操作(只是少了左右括号相匹配的过程,改成了遍历的元素与栈顶元素是否相等)
class Solution {
public boolean isValid(String s) {
if(s.isEmpty())
return true;
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;
}
if(stack.empty())
return true;
return false;
}
}
方法二:使用HashMap
HashMap中,key为左括号,value为右括号。
遍历的同时,转换成字符类型,遇到左括号,入栈,否则就弹栈一个元素,查看map中它的value是否为将要遍历的字符ch(也就是右括号)
这里有一个细节,是我们提前将栈中压入一个 '?'字符,是因为防止出现 "(){}}{" 这种情况,会导致java.util.EmptyStackException,也就是空栈的时候还让他弹栈。这样子的话,整个遍历完,就不是返回栈是否为空了,而是栈顶元素是否为‘ ?’
class Solution {
public boolean isValid(String s) {
Map<Character,Character> map = new HashMap<>();
map.put('{','}');
map.put('(',')');
map.put('[',']');
Stack<Character> stack=new Stack<Character>();
if(s.length()>0 && !map.containsKey(s.charAt(0)))
return false;
stack.push('?');
for(Character ch : s.toCharArray()){
if(map.containsKey(ch)){
stack.push(ch);
}else if(map.get(stack.pop())!=ch){
return false;
}
}
return stack.pop()=='?';
}
}