题目大意:括号匹配问题——左半边括号必须与右边匹配上才能为true,否则为false,且有顺序。
import java.util.*;
public class day05_括号匹配 {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) { //必须是偶数个括号才能匹配
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{ //利用HashMap来储存匹配关系,右括号为K,左为V
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>(); //Deque来代替stack
for (int i = 0; i < n; i++) {
char ch = s.charAt(i); //循环遍历
if (pairs.containsKey(ch)) { //如果是右括号开始判断
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop(); //匹配出栈
} else {
stack.push(ch); //左括号加入,等待匹配
}
}
return stack.isEmpty(); //判断最后是否为空
}
}
题解:
利用Map和栈来匹配
1.首先判断个数是否为偶数个,不是的话直接返回false
int n = s.length();
if (n % 2 == 1) { //必须是偶数个括号才能匹配
return false;
}
然后就要建立一个Map来进行匹配,考虑到这种括号都是 左 右 的形式,所以将右边作为key,左边作为value来进行配对
character是字符
Map<Character, Character> pairs = new HashMap<Character, Character>() {{ //利用HashMap来储存匹配关系,右括号为K,左为V
put(’)’, ‘(’);
put(’]’, ‘[’);
然后建立satck来存储和返回结果
stack = new Linkedlist <> ();
然后将传入进来的string s 进行拆解
使用for 循环
for (int i=0 ; i< n ; n++)
char ch = s.charAt(i);
然后再来判断单独拆解的每一个字符里面有没有匹配的(右边的话就去匹配左边,左边就入栈等待匹配)
if (pairs.containskey(ch)){
if(stack.isEmpty || stack.peek() != pairs.get(ch)){
return false ;
} else{
stack.pop ;
} else{
stack.push(ch)}
}
最后确认一下整个栈是否为空
return stack.isEmpty() ;