20、有效的括号(LeetCode)
题目
来源:力扣(LeetCode)
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
输入: "()"
输出: true
示例2:
输入: "()[]{}"
输出: true
示例3:
输入: "(]"
输出: false
示例4:
输入: "([)]"
输出: false
示例5:
输入: "{[]}"
输出: true
思路
-
可以将这些字符串放入栈中,通过栈来解决这个问题
-
此题中不存在半个区间嵌套的情况,如示例3和4,换句话说,出现闭区间字符时候,他只能和上一个元素匹配,上个元素是否符合是同个区间类型而且同时又是开区间
-
我们将已经比配的区间从栈中去除
实现
class Solution {
public boolean isValid(String s) {
//定义一个hashMap,用来存放让括号匹配的值
HashMap<Character,Character> hashMap = new HashMap<>();
hashMap.put(')','(');
hashMap.put(']','[');
hashMap.put('}','{');
//初始化一个栈
Stack<Character> stack = new Stack<>();
//遍历字符串s
for (int i = 0;i < s.length();i++){
//获取当前字符串的第i个的字符
char c1 = s.charAt(i);
//判断当前字符是不是闭区间
if (hashMap.containsKey(c1)){
//获取当前栈的栈顶,判断当前栈是否为空栈,如果为空栈返回字符'#',否则返回栈顶元素 pop():获取当前栈的栈顶,并删除栈顶元素
char top = stack.empty()?'#':stack.pop();
//判断栈顶元素是不是,当前字符的开区间
if (top != hashMap.get(c1)){
//不是当前字符的开区间,则返回false,这已经是无效字符了。
// 可以自己假设一下,如果是当前字符开区间的话,就出现了半个区间的嵌套 如 : {),这是无效的
return false;
}
}else {
//如果当前的字符是开区间,继续存入栈中
stack.push(c1);
}
}
//最后返回这个栈,如果栈为空,则证明这是一个有效的字符串
return stack.empty();
}
}