努力坚持尽量别忘了打卡, leetcode
20题有效的括号,难度:easy
一、题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。 示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
示例 4:
输入: s = "([)]"
输出: false
示例 5:
输入: s = "{[]}"
输出: true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
二、解题思路
这次依然参考了官方解法,使用栈的思想去解题,该说不说,还是学到了东西的! 大家要先理解栈这个概念,先进后出
- 先进行一个判断,如果括号有效那么字符长度一定为偶数
- 使用Map 来构建一个键值对,key为
右括号,值为左括号(没反应过来的,先往下看) - 遍历字符串,先判断字符是否为
右括号不是则把它放入栈中 - 当字符为右括号时,我们先判断
栈是否为空,取栈的最后一位 去和Map的键值作比较,不同则证明括号不匹配,相同则 将其从栈中移除 - 最终 栈空既全部匹配(因为每次匹配全时,会有个匹配项从栈中移除),不空则证明有不匹配的项
三、代码
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 括号成对 长度必是偶数
if(s.length % 2 != 0) return false
const pairs = new Map([
[')', '('],
[']', '['],
['}', '{']
]);
let result = []
// 利用栈的 思路解题 先进后出
for(let str of s) {
if(pairs.has(str)) {
// 当栈空 或者 当前项与pairs中的不匹配时
if(!result.length || result[result.length - 1] != pairs.get(str)) {
return false
}
// 有匹配的 栈中移除匹配项
result.pop()
} else {
// 放入栈中
result.push(str)
}
}
// 栈空 既全部匹配,栈有剩余 则证明有不匹配的括号
return !result.length
};
四、反思一下(大白话时间)
反思一下,第一次讲栈的概念落地,这道题是个easy 题,对栈有一定理解的,再来做这道题对于刚入手的人还是挺友好的,写这篇文章的概念就是想复盘一下这个做题思路,因为参考了官方的做法嘛,要验证一下自己吸收了没有。
整挺好,加油!