算法之字符串的括号匹配

57 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

关于算法系列已更新部分文章,后续会陆续增加内容:

【1】 算法之用动态规划实现斐波那契数列

【2】 算法之双指针法的应用

【3】 算法之链表的含义

【4】 算法之移除链表元素

题目描述

题目指路:20. 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入: s = "()[]{}"

输出: true

示例 2:

输入: s = "(]"

输出: false

实现思路

这道题目属于一道比较简单的题目,实现方式有三种,有其它解法可以一起交流。

首先判断括号是否匹配,需要用到的概念。由于栈是后进先出的,可以把左侧括号全部入栈,遇到右侧括号的时候对比栈顶元素,如果匹配成功则出栈,否则直接返回 false。

所以需要考虑好括号的匹配判断如何实现:

  • 方式1:栈 + 字符串判断(使用includes())
  • 方式2:栈 + Map 判断
  • 方式3:栈 + 对象Object判断(键值对的形式匹配)

代码实现

经过实测,new Map() 的方式相对稍快些,顺便可以练习 Map 的使用

    1. new Map 这里注意需要括号的顺序是反写,相当于从Map中获取括号的对应值
    1. 运行结果:Map(3) { ')' => '(', '}' => '{', ']' => '[' }
    1. 栈顶元素和当前元素的对应括号是否匹配
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}`)

运行结果:

image.png

注:上面这种代码方式只能匹配中包含括号的字符串,包含其他字符无法匹配

关于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