有效的括号
一、题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
- 1 <= s.length <= 104
- s 仅由括号 ‘()[]{}’ 组成
二、思路
- 当遇到匹配的最小括号对时,我们将这对括号从栈中删除(即出栈),如果最后栈为空,那么它是有效的括号,反之不是
- 注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回 False,省去后续的遍历判断过程。
三、解法
以下内容包含了各种类型的解法,建议你直接跳到文末,看推荐版
解法1
用switch 判断括号匹配情况
var isValid = function (s) {
const n = s.length;
if (n % 2 === 1) {
return false;
}
const stack = [];
for (let i = 0; i < n; 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;
};
版本2
用对象的键值对存储匹配括号
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
// 缓存 s.length的结果
const n = s.length
// 比较前预判断
if (n % 2 === 1) {
return false;
}
let stack= []
const match= {
')':'(',
'}':'{',
']':'[',
}
for(let i=0 ; i < n ; i++){
if(s[i] === '(' || s[i] === '{' || s[i] === '['){
stack.push(s[i])
}else{
if(!stack.length){
return false
}
if(match[s[i]] != stack.pop()){
return false
}
}
}
// 简化 return
return !stack.length
};
版本3
用 || 判断括号的匹配情况
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length
if (n % 2 === 1) {
return false;
}
let stack = []
for(let i=0 ; i < n ; i++){
const c = s[i]
if(c === '(' || c === '{' || c === '['){
stack.push(c)
}else{
const t = stack[stack.length -1]
if(
(t === '(' && c === ')') ||
(t === '{' && c === '}') ||
(t === '[' && c === ']')
){
stack.pop()
}else{
return false
}
}
}
return !stack.length
};
版本4 (推荐版)
用map存储匹配的括号
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
const n = s.length
if (n % 2 === 1) {
return false;
}
let stack = []
const map = new Map();
map.set('(',')')
map.set('{','}')
map.set('[',']')
for(let i=0 ; i < n ; i++){
const c = s[i]
if(map.has(c)){
stack.push(c)
}else{
const t = stack[stack.length -1]
if(map.get(t) === c){
stack.pop()
}else{
return false
}
}
}
return !stack.length
};
四、拓展 pop()、push()
pop():用于删除数组的最后一个元素,并返回被删除的元素
。
push():用于向数组末尾添加一个或者多个元素,并返回新的长度
。