给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
var isValid = function(s) {
const len = s.length;
/**
* 特殊情况处理
**/
// 空字符串可被认为是有效字符串
if(len === 0) {
return true;
}
// 剪枝,字符串长度为奇数,必然无效
if(len % 2 === 1) {
return false;
}
// 定义字符串匹配 map
const map = {
'}' : '{',
')' : '(',
']' : '['
}
// 使用栈来校验闭合情况
const stack = []
for (let i = 0; i <= len - 1; i++) {
if(!map[s[i]]) {
// 左括号,入栈
stack.push(s[i]);
} else {
// 右括号,出栈,判断如果与前一个括号不匹配,返回 false
if(map[s[i]] !== stack.pop()) {
return false;
}
}
// 剪枝,如果待匹配左括号的数量超过一半,返回 false (奇数已先前排除)
if(stack.length > len / 2) {
return false;
}
}
// 遍历结束,如果仍有未匹配完的左括号,返回 false
if(stack.length > 0) {
return false;
} else {
return true;
}
}
