题目描述:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串
示例 1:
输入: “()[]{}”
输出: true
解题思路:栈
对于判断括号的有效性这一类问题都可以使用栈这一数据结构来解决。
在对字符串进行遍历的时候,当遇到一个左括号的时候,我们会希望在后续遍历的时候有一个相应的右括号将其闭合。根据这一特点,即后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。
即具体的实现思想为:
(1) 使用栈这一数据结构
(2) 当我们在遍历时遇到一个右括号的时候,需要判断是否有相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号
(3) 如果是相同类型的括号,则栈顶的括号执行出栈操作,继续向后遍历
(4) 如果不是相同类型的括号,或者栈中并没有左括号,那么字符串 s 无效,返回 false。
(5) 在遍历结束时,如果栈中没有左括号,说明我们将字符串 s 中的所有左括号闭合,返回 true,否则返回 false。
注:
(1) 有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,可以直接返回false,省去后续的遍历判断过程。
(2) 为了快速判断括号的类型,我们可以使用HashMap存储每一种括号。哈希映射的键为右括号,值为相同类型的左括号。
class Solution {
public boolean isValid(String s) {
int len = s.length();
//对于一个只包括括号的字符串,若字符串有效,其长度必定不为偶数
if(len % 2 != 0){
return false;
}
//右括号作为键,左括号作为值
Map<Character, Character> pairs = new HashMap<>();
pairs.put(')', '(');
pairs.put(']', '[');
pairs.put('}', '{');
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < len; i++){
char ch = s.charAt(i);
if(pairs.containsKey(ch)){//判断Map集合对象中是否包含指定的键名
if(stack.isEmpty() || stack.peek() != pairs.get(ch)){
return false;
}
stack.pop();//如果stack.peek()==pairs.get(ch) 出栈
}else{
stack.push(ch);//进栈的都是左括号
}
}
return stack.isEmpty();
}
}