给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入: s = "()[]{}"
输出: true
示例 2:
输入: s = "(]"
输出: false
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
// 方法一:
// 为奇数时 返回false
if (s % 2 == 1) return false
let stack = [];
let map = new Map([
[')', '('],
['}', '{'],
[']', '[']
])
for(let key of s){
// 当在map结构中遇到 反括号')'、'}'、']'时
// 判断map中对应的value 和 stack栈内最后一位是否相等
// 如果不等直接返回false,否则向栈内塞入数据
if(map.has(key)){
if(!stack.length || map.get(key) !== stack[stack.length -1]){
return false
}else{
stack.pop()
}
}else{
stack.push(key)
}
}
return !stack.length;
// 方法二:
// 循环当遇到正括号'('、'{'、'['、时,向栈内塞入对应的反括号
// 循环当遇到反括号')'、'}'、']'时,判断当前数值与栈内栈顶是否相等,
// 不相等返回false,如果相等出栈继续下一轮
// 循环跳出后判断栈内如果有数据返回false,没有数据返回true
// 为奇数时 返回false
if (s % 2 == 1) return false
const stack = [];
for (let i = 0; i < s.length; i++) {
let c = s[i];
switch (c) {
case '(':
stack.push(')');
break;
case '[':
stack.push(']');
break;
case '{':
stack.push('}');
break;
default:
if (c !== stack.pop()) {
return false;
}
}
}
return stack.length === 0;
};