题目:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例:
输入: s = "()"
输出: true
知识点:
- 栈
- Map
代码:
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
let n = s.length;
// 1.判断该字符串是否为偶数,奇数肯定无法对应,为无效字符串
if (n % 2 === 1) return false;
// 2.新建一个map对象实现括号的对应关系,以及一个栈stack
let map = new Map([
[")", "("],
["]", "["],
["}", "{"],
])
let stack = [];
for (ch of s) {
// 3.循环字符串判断Map是否含有该元素
// 3.1 如果有
if (map.has(ch)) {
// 以下两个条件是无法产生对应关系的
// a.stack的长度为空
// b.当前匹配的字符串的值与stack的最后一个元素不相等
if (!stack.length || stack[stack.length - 1] !== map.get(ch)) {
return false;
}
// 3.2 产生对应关系,删除最后一个元素
stack.pop();
} else {
// 3.3 如果没找到,那么就直接入栈
stack.push(ch);
}
}
// 4.最后返回栈的长度,如果为0那么就都是对应的关系消除了,反之则不是;
return stack.length === 0;
};