有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
构建一个栈,匹配字符串
switch 匹配
遍历字符串,如果是左括号就入栈,如果是右括号就和栈顶的元素匹配,不匹配则返回false
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
// 栈
let stack = []
let len = s.length
// 有效字符串一定为偶数长度
if (len % 2 !== 0) return false
for (let i = 0; i < len; i++) {
switch (s[i]) {
case '(':
case '[':
case '{':
stack.push(s[i])
break;
case ')':
if (stack.pop() !== '(') return false
break;
case ']':
if (stack.pop() !== '[') return false
break;
case '}':
if (stack.pop() !== '{') return false
break;
}
}
return !stack.length
};
map优化
将 Switch 匹配替换成map 右括号为key 左括号为 value,左括号直接入栈,右括号判断是否和栈顶括号匹配
var isValid = function (s) {
let len = s.length
let stack = []
if (len % 2 !== 0) return false
// 优化Switch case
const map = new Map([
[')', '('],
[']', '['],
['}', '{'],
])
for (let i = 0; i < len; i++) {
// 右侧括号
if (map.get(s[i])) {
// 右括号是否匹配栈顶元素
if (map.get(s[i]) !== stack[stack.length - 1]) return false
else stack.pop()
} else {
stack.push(s[i])
}
}
return !stack.length
}