「这是我参与11月更文挑战的第 18 天,活动详情查看:2021最后一次更文挑战」
题目来源:leetcode 20. 有效的括号
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
题解
提出问题
- 有效括号需要满足哪些条件?
分析
-
从题目中可以看处,字符串
s
值包含'(',')','{','}','[',']'
,当字符串s
满足左括号必须用相同类型的右括号闭合并需要按照正确的顺序闭合 -
由于括号闭合顺序是先入后出与栈数据结构一样,因此使用栈数据结构来解决问题,定义
map
变量创建栈存储左括号 -
通过
for of
遍历字符串s
-
当遇到左括号时,通过
push
入栈stack
-
当与到右括号时,通过
pop
出栈stack
并判断括号类型是否一样,不一样的话return false
-
假设字符串
s
为{[()]}
- 开始遍历字符串
s
,此时第一位为左括号{
,因此通过push
入栈stack
- 重复执行上述操作,当遇到
)
时,通过pop
出栈并判断类型是否一样
- 一样的话继续执行直至字符串
s
遍历完成时,通过判断stack
的长度是否为0,为0则是有效括号
- 当一开始就遇到
)
时,说明字符串s
为无效括号
- 当然我还可以通过字符串
s
的长度来判断是否有效,字符串s
的长度为奇数时必然时无效括号
代码实现
/**
* @param {string} s
* @return {boolean}
*/
let isValid = function(s){
let size = s.length
if(size % 2 !== 0) return false
let map = new Map([
["]","["],
[")","("],
["}","{"],
])
let stack = []
for(ch of s){
if(map.has(ch)){
if(!stack.length || stack[stack.length - 1] !== map.get(ch)){
return false
}
stack.pop()
}else{
stack.push(ch)
}
}
return stack.length === 0
}
复制代码