每日一题:有效的括号(栈

64 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

leetcode第20题:有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

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

示例 2:

输入:s = "{(]}"
输出:false

二、思路分析:

栈结构的特点:先入后出,后入先出。(可以视为一个有底的桶)

  1. 这个典型的利用栈的思想来做。
  2. 以示例1来说:我们对字符串进行遍历:①第一个字符为(左括号,我们入栈。②下一个为)右括号,就将栈中的左括号出栈,目前栈为空。③第3个字符为[也是左括号,入栈。④第4个为{也入栈,目前栈中为:[{。⑤第5个为},可以匹配上栈顶的{{出栈。⑥第6个为],匹配到最新的栈顶[[符号出栈。⑦检测栈目前为空,没有多余的符号,return true。
  3. 以示例2来看:①第一个字符为{左括号,我们入栈。②下一个为(左括号,也入栈,目前栈为{(。③第3个字符为]为右括号,右括号需要在栈中寻找对应的左括号匹配,发现栈顶的括号并不匹配,说明错误,直接return fasle

三、AC 代码:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    const stack = []
    const obj = { '(': ')', '{': '}', '[': ']' }
    for (let i=0;i<s.length; i++) {
        const item = s[i]
        if (item in obj) {
            // item是obj的key:说明是左括号,入栈
            stack.push(item)
        } else {
            // 否则为右括号,判断是否跟栈顶匹配
            // 栈顶即数组的最后一位,不匹配的话则直接返回false,不用后面的循环
            if (item!==obj[stack.pop()]) {
                return false
            }
            // 匹配的话则不进行任何操作了,上面判断时已进行了出栈操作。直接下一轮循环即可
        }
    }
    return !stack.length;
};

四、总结:

本题可扩展为各种成对的符号的判断,另外还有类似栈结构相关题目的有:

32. 最长有效括号

71. 简化路径

224. 基本计算器