「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
题目:
20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入: s = "()"
输出: true
复制代码
示例 2:
输入: s = "()[]{}"
输出: true
复制代码
示例 3:
输入: s = "(]"
输出: false
复制代码
示例 4:
输入: s = "([)]"
输出: false
复制代码
示例 5:
输入: s = "{[]}"
输出: true
复制代码
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
思路
-
首先,我们通过
map
对象建立好各个类型的左右括号之间的映射关系; -
建立一个空数组
stack
,存放左括号; -
遍历字符串,判断当前位置如果是左括号,就直接
push
到stack
中; -
当前位置如果是右括号,我们需要进行判断:
(1) 前面是否有左括号;
(2) 前面是的最后一个左括号是否与当前右括号配对;
-
如果满足条件,就从当前
stack
中删除最后一个元素,否则表示匹配失败,直接返回false
; -
循环结束,判断是否有残留的左括号,没有的话证明匹配成功。
实现:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length;
// 先建立起对应关系
let map = new Map();
map.set("(", ")");
map.set("{", "}");
map.set("[", "]");
let stack = [];
for (let i = 0; i < n; i++) {
let cur = s.charAt(i);
// 判断是否左括号, 是的话直接入库,不是的话出库匹配
if (map.has(cur)) {
stack.push(cur);
} else {
let last = stack.pop();
if (map.get(last) !== cur) {
return false;
}
}
}
// 循环结束,说明没有不符合条件的情况, 这时候判断是否还有左括号没匹配即可
return stack.length === 0;
};
复制代码
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。