LeetCode第20题(有效括号),辅助栈题解思路

269 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

  • 栈的数据结构为后进先出(LIFO),可使用数组或链表的方式实现
  • 实际应用场景:
    • 系统调用栈,多个方法嵌套调用,最后调用的方法,最先执行完毕
    • 使用栈实现浏览器前进后退,先后进入A/B/C三个页面,最后进入的C页面,点击后退时,C页面反而最先返回

LeetCode第20题:有效括号

题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1: 输入:s = "()" 输出:true
示例 2: 输入:s = "()[]{}" 输出:true
示例 3: 输入:s = "(]" 输出:false
示例 4:输入:s = "([)]" 输出:false
示例 5:输入:s = "{[]}" 输出:true
提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路

  • 遍历字符串,新建存储空间
    • 情况1:按先后顺序记录所有出现过的左边括号,已记录左括号如果能够满足后记录先匹配的原则,与剩余字符串按顺序按顺序一一配对,那么结果返回true,否则返回false
    • 情况2:如果在记录左括号的同时,还夹杂了右括号,那么可立刻判断此右括号与最后一个记录的左括号是否成对,是则继续执行,否则返回false
  • 配对成功的括号,执行出栈操作,如果全部匹配出栈,结果返回true,否则返回false
  • 括号是成双成对出现的,所以字符串长度如果是奇数,返回false

代码实现

 /**
 * @param {string} s
 * @return {boolean}
 */
const isValid = function(s) {
    if (!s.length || s.length % 2 === 1) return false
    // 这里使用数组的方式实现栈
    // 查看栈顶: stack[stack.length - 1]
    // 压栈: stack.push()
    // 出栈: stack.pop()
    let stack = []
    for(let i = 0;i < s.length; i++) {
        if (s[i] === '{' || s[i] === '[' || s[i]=== '(') {
            stack.push(s[i])
        } else {
            // 第一次遍历或遍历后一个左括号都不存在或先出现右括号,返回false
            if (stack.length === 0) return false
            // 中间值
            let match = ''
            if (s[i] === '}') {
                match = '{'
            } else if (s[i] === ']') {
                match = '['
            } else if (s[i] === ')') {
                match = '('
            }
            if (match !== stack[stack.length - 1]) {
                return false
            } else {
                stack.pop()
            }
        }
    }
    // 遍历后如果stack全部匹配完成,那么返回true,否则返回false
    return !stack.length
};