前言
第一次遇见她时,我没有穿西服,没打领带,只背着VSCode。
我手里只有hash表和栈,身无分文,我该如何征服她?
我思来想去,决定以哈希表为西服,以栈为领带,来一次cosplay。
好了,编不下去了。其实我是在刷leetcode第20题-有效的括号, 女人只会影响我拔刀的速度
一、题目描述
leetcode地址
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
二、遇见坑我
我是不会告诉你们,坑我就是坑爹。
- 在第一次提交答案的时候,我没有考虑到一个地方,遇见右括号栈为空的情况
三、解题思路
- 括号数目不为偶,就应该停止不前了
- 后遇到的括号应该先闭合,故用栈
- 括号的左右对应关系用哈希表存
- 遇到左括号压栈
- 遇到右括号出栈,但是这里要注意判定下栈是否为空
四、代码
注释已经很详细了,但是你们千万不要昧着良心说 “兄弟这波操作细啊”
git代码地址
const isValid = function (s) {
// 如果左右括号数总数为奇数,说明肯定不是有有效括号
if(s.length % 2 !== 0) return false
// 用栈,后遇到的左括号用先闭合, 符合后进先出
const stack = []
// 左右括号对应,描述闭合关系
const hashMap = new Map([
[')', '('],
[']', '['],
['}', '{']
])
// 遍历传入字符, 遇到左括号压栈,遇到右括号,若栈为空,则返回false, 若栈顶元素不是对应左括号,返回false
for(let val of s) {
// if 里面是遇见右括号, else 里是遇见左括号
if(hashMap.has(val)) {
// 遇见右括号,栈为空,返回false
if(stack.length < 0) return false
// 栈不为空,出栈,若不是有效闭合,返回false
const left = stack.pop()
if(left !== hashMap.get(val)) return false
} else {
// 遇见左括号,进栈
stack.push(val)
}
}
// 遍历结束后,栈不为空则说明不是有有效括号,为空则说明是有有效括号
return stack.length === 0
}