初步学习了栈,现在用一道题去深入理解栈。
我们来研究一个经典的问题--括号匹配
leetcode20
给定一个只括号‘(’,‘)’,‘{’,‘}’,‘[’,‘]’,的字符串s,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号。
示例:
输入:s=“(){}[]”
输出:true
首先将所有的符号存到哈希表中,左半边做key,右半边做value。遍历字符串,如果遇到左半边符号就入栈,遇到右半边符号就与栈顶的符号比较,若不匹配则返回false,否则返回true。
public static boolean isMatch(String s){
if (s.length() <= 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++){
char item = s.charAt(i);//取符号
//检查map中是否有含这个符号的key,如果有放入到栈中
if (map.containsKey(item)){
stack.push(item);
}else {
if (!stack.isEmpty()){
//取栈顶元素
Character left = stack.pop();
//匹配map
char rightChar = map.get(left);
if (rightChar != item){
return false;
}
}else {
return false;
}
}
}
return stack.isEmpty();
}