有效的括号(简单)
题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
代码解析
// 1. 根据题目可以得到该字符串长度为偶数,提前排除奇数长度的字符串
if (s.length() % 2 != 0) return false;
// 2. 题目末尾提示空字符串为有效字符串(注意:这一条有可能会被忽略导致后面代码运行错误)
if (s.equals("")) return true;
// 3.创建一个Map集合存放几个括号类型
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
// 4.判断如果是以右括号开头的直接判定为无效字符串
if (map.containsKey(s.charAt(0))) return false;
// 5.创建一个LinkedList集合存储每一位字符
LinkedList<Character> list = new LinkedList<>();
// 6.遍历字符串
for(int i = 0; i < s.length(); i++ ){
/*
判断当前位置的字符是否在Map集合中
如果存在,list集合的末尾是否与之匹配为一对
匹配则删除list集合末尾元素,不匹配则将该元素添加至list集合尾部
*/
if(map.containsKey(s.charAt(i)) && list.getLast().equals(map.get(s.charAt(i)))) {
list.removeLast();
}else{
list.add(s.charAt(i));
}
}
// 7.根据list集合的长度判断该字符串是否都能相互匹配,返回结果
return list.size() == 0;
提交结果

有效的括号(简单)-末尾消除.png
小结: 一开始没审清题意,在空字符串那里就踩了个坑,后面在括号那边也进了一条岔路,只做了顺序的判断(如: "[][][]")以及中间的判断(如: "((()))"),所以直接用了两个变量分别获取 i 与 i+1 的位置来判断每一位元素.
后面重新整理了一下思路发现要实现该效果还是很简单的,使用后进先出的 栈 模式就能实现该效果,每次获取最后两位判断是否匹配,删除匹配的括号,达到一遍遍历的效果
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses