有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
1.思路
使用栈的方式。我们将左边的括号压入到栈中,当出现右边的括号时,就从栈中出来一个括号来判断是否符合,如果符合的话就说明能够满足。不符合的话就直接返回false;当字符串中的全部括号都进来过之后,栈中应该就没有括号的数据了,然后返回true.
2.使用栈的方式(带Map)
public class EffectiveBrackets{
private static final HashMap<Character,Character> hashMap = new HashMap(){
{
put('(',')');
put('[',']');
put('{','}');
// 多放一个值是为了,当字符串中有多的右括号时,栈可能会获得一个空值,所以多添加一个值作为保险
put('?','?');
}
};
public boolean isValid(String s){
Stack<Character> stack = new Stack(){{add('?');}};
for(char c: s.toCharArray()){
// 如果key集合中包含这个字符,则说明这个字符是一个左括号,就可以直接添加。
if(hashMap.containsKey(c)){
stack.push(c);
}else if(hashMap.get(stack.pop()) != c){
// 如果是右括号,则从栈中取出一个最近放入的左括号,然后从map中获取对应的右括号进行比较。
return false;
}
}
return stack.size() == 1;
}
}
3.使用栈的方式(不带map)
public class EffectiveBrackets{
public boolean isValid(String s){
Stack<Character> stack = new Stack();
for(char c:s.toCharArray()){
// 如果当前括号是一个左括号,就直接放入到栈中
if(c == '(' || c == '{' || c == '['){
stack.push(c);
}else{
// 若当前stack不为空,则取值出来比较,若为空则返回false
if(!stack.isEmpty()){
// 如果括号是一个)
if(c == ')'){
if(stack.pop() != '('){
return false;
}
}else if(c == ']'){
if(stack.pop() != '['){
return false;
}
}else if(c == '}'){
if(stack.pop() != '{'){
return false;
}
}else{// 都不符合,直接返回false;
return false;
}
}else{
return false;
}
}
}
return stack.isEmpty();
}
}
4.优化版思路
使用了类似于消消乐的方式来进行处理,最后判断字符串中的括号是否被消除完了,如果没有则说明不是有效的括号
public boolean isValid(String s) {
while(true){
int l=s.length();
s=s.replace("()","");
s=s.replace("{}","");
s=s.replace("[]","");
if(s.length()==l){return l==0;}
}
}