「这是我参与11月更文挑战的第 14 天,活动详情查看:2021最后一次更文挑战」
原题链接
20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
测试用例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
参数限制
- 1 <= s.length <= 104
- s 仅由括号
()[]{}组成
分析
由题已知,由一个字符串,由 ()[]{} 组成,我们需要判断这个字符串中的括号是否成对的出现
最简单的一个思路就是,使用一个栈,遇到左括号,就入栈,遇到一个右括号,就出栈,然后判断两个括号是否成对出现
代码
var isValid = function(s) {
let arr = [];
let flag = true;
s = s.split('').forEach(n => {
switch (n) {
case '(':
case '[':
case '{':
arr.push(n);
break;
case ')':
if (arr.pop() != '(') flag = false;
break;
case ']':
if (arr.pop() != '[') flag = false;
break;
case '}':
if (arr.pop() != '{') flag = false;
break;
}
})
return flag && arr.length == 0;
};
从运行的效果来看,耗时和内存勉勉强强及格吧,但是代码这里显得非常的冗余
优化
上述的代码,最大的问题就是没法做到左右括号的对应,并快速查找对应的另一半括号,然后就在 case 中走了一层层的条件判断
那么,在继续使用栈辅助的情况下,引入一个 map 类型,来优化括号的查找,在 js 中,object 也可以实现简单的 map 功能
我们定义2个 obj,我们遍历字符的时候,判断左括号是否在 left 中,在的话,直接入栈;不在的话,将他在 right 中转为对应的左括号,并与出栈的符号比较,相等则继续;不等则表示此字符串不是一个有效的
var isValid = function(s) {
let left = {
'(': ')',
'[': ']',
'{': '}'
},
right = {
')': '(',
']': '[',
'}': '{'
}
let arr = [];
for (let i = 0; i < s.length; i++) {
let c = s.charAt(i);
if (left[c] != undefined) {
arr.push(c);
} else {
if (left[arr.pop()] != right[c]) {
return false;
}
}
};
return true && arr.length == 0;
}
功夫不负有心,这性能直接好上了一大截,耗时和内存已经接近双百
今天的力扣刷题就分享到这里,感谢大家的阅读~