一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
有效的括号
题目解析
题目提供素材
本道题目提供的素材,只有一个字符串。
- 一个只包含'(',')','{','}','[',']' 的字符串。
并且这个字符串中可能含有多组、多个相同符号。
我的解读
看到这道题,就会想到使用特殊的数据结构去实现是最好的。
但是往往很多人不能充分了解数据结构,我就是一个数据结构渣渣,所以我使用了硬性逻辑去解决了这个问题。
通过内置正向组合'(',')','{','}','[',']'。
反向组合')','(','}','{',']','['。
封装成两个Map,再通过两个中间值集合,分别是字符值Map,匹配值List。
具体的看一下解题思路吧。
解题思路
先内置参数zMap,fMap;
然后分隔字符串,进行对字符数组的循环遍历。
在遍历过程中,共有两大分支:
其一,正向字符,比如(、[、{
其二,反向字符,比如)、]、}
1.正向字符存储下来等待反向字符出现后合并。并且存储一个中间List,此list中存储的是相应反向字符合并的顺序。
注意:这里题目中需要考虑顺序,我前两次提交都没有考虑顺序,所以都提交失败了,大家不要忘了。
2.反向字符用来合并消除正向字符,就跟消消乐一样。
最后循环完成后,查看map集合中是否还存在没有消除的字符,如果有就返回false,如果没有就是true。
代码
执行代码如下,还是有优化空间的。
class Solution {
public boolean isValid(String s) {
if(s.length() % 2 != 0){
return false;
}
Map<String,String> zMap = new HashMap<>();
Map<String,String> fMap = new HashMap<>();
zMap.put("(",")");
fMap.put(")","(");
zMap.put("{","}");
fMap.put("}","{");
zMap.put("[","]");
fMap.put("]","[");
Map<String,Integer> map = new HashMap<>();
List<String> list = new ArrayList<>();
String[] as = s.split("");
for (String a : as){
if(fMap.get(a) != null){
Integer num = map.get(fMap.get(a));
if(map.get(fMap.get(a)) == null){
return false;
}else if(!a.equals(list.get(list.size()-1))){
return false;
}else if(num <= 1){
map.remove(fMap.get(a));
}else{
map.put(fMap.get(a), --num);
}
list.remove(list.size()-1);
}else{
Integer num = map.get(a);
if(num != null){
map.put(a, ++num);
}else{
map.put(a, 1);
}
list.add(zMap.get(a));
}
}
return map.keySet().size() == 0;
}
}
执行结果
执行结果图如下所示,此类问题很多人都在使用栈来解决,对有些初学者不是特别友好,所以使用了通俗的写法,不过效率堪忧。