# 有效的括号
力扣🔗:https://leetcode-cn.com/problems/valid-parentheses (opens new window)
# 题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 10^4
s 仅由括号 '()[]{}' 组成
# 解题思路
- 模拟栈后进先出操作,进行括号匹配。
- 创建数组
arr
,用来存放没有匹配的括号字符。 - 依次遍历
s
中的每个字符,判断该字符是否是右括号()
、}
、]
),如果是则判断arr
中栈顶元素是否与该字符匹配,若匹配则弹出该元素,否则推入当前遍历到的字符。 - 最后判断
arr
数组是否是空数组,如果是则表示该字符串有效。
# 代码实现
/**
* @param {string} s
* @return {boolean}
*/
function isValid(s) {
if (s.length % 2) return false // 如果长度为奇数
const arr = []
for (let i = 0; i < s.length; i++) {
const c = s[i]
const p = c === ')' ? '(' : c === '}' ? '{' : c === ']' ? '[' : false
p && p === arr[arr.length - 1] ? arr.pop() : arr.push(c)
}
return arr.length === 0
}