持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
关于算法系列已更新部分文章,后续会陆续增加内容:
【1】 算法之用动态规划实现斐波那契数列
【2】 算法之双指针法的应用
【3】 算法之链表的含义
【4】 算法之移除链表元素
题目描述
题目指路:20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()[]{}"
输出: true
示例 2:
输入: s = "(]"
输出: false
实现思路
这道题目属于一道比较简单的题目,实现方式有三种,有其它解法可以一起交流。
首先判断括号是否匹配,需要用到栈
的概念。由于栈是后进先出的,可以把左侧括号全部入栈,遇到右侧括号的时候对比栈顶元素,如果匹配成功则出栈,否则直接返回 false。
所以需要考虑好括号的匹配判断如何实现:
- 方式1:栈 + 字符串判断(使用includes())
- 方式2:栈 + Map 判断
- 方式3:栈 + 对象Object判断(键值对的形式匹配)
代码实现
经过实测,new Map() 的方式相对稍快些,顺便可以练习 Map 的使用
-
- new Map 这里注意需要括号的顺序是反写,相当于从Map中获取括号的对应值
-
- 运行结果:Map(3) { ')' => '(', '}' => '{', ']' => '[' }
-
- 栈顶元素和当前元素的对应括号是否匹配
var isValid = function(s) {
if (s.length === 0) return false
const map = new Map( // 1.
[
[')', '('],
['}', '{'],
[']', '['],
]
)
console.log(map) // 2.
let arr1 = []
for(let str of s) {
if(map.has(str)) { // 是否存在key
if(arr1[arr1.length -1] !== map.get(str)) { // 3.
return false
}
arr1.pop() // 匹配,出栈
} else {
arr1.push(str) // 左括号,入栈
}
}
return !arr1.length
};
var str1 = "{[]}"
var res1 = isValid(str1)
console.log(`匹配的字符串:${str1}`)
console.log(`结果:${res1}`)
var str2 = "{]"
var res2 = isValid(str2)
console.log(`匹配的字符串:${str2}`)
console.log(`结果:${res2}`)
运行结果:
注:上面这种代码方式只能匹配中包含括号的字符串,包含其他字符无法匹配
关于Map
- Map初始化需要的是一个二维数组
- Map的形式是键值对,键不能修改,值可以修改
let map = new Map();
map.set('num1','1') // 添加key和value值
判断是否存在key,存在返回true,反之为false
map.has('num1') //true
map.has('n') //false
根据key获取value
map.get('num1') //1
删除 key为num1的value
map.delete('num1')
map.get('num1') //undefined