【每日算法】LeetCode 20. 有效的括号

对前端开发者而言,学习算法绝非为了"炫技"。它是你从"页面构建者"迈向"复杂系统设计者"的关键阶梯。它将你的编码能力从"实现功能"提升到"设计优雅、高效解决方案"的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 20. 有效的括号:前端开发者的解析与实现

1. 题目描述

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

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

示例:

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

2. 问题分析

这是一个经典的括号匹配问题,在前端开发中广泛存在类似场景,例如:

  • HTML/XML 标签闭合检查 :确保 <div></div> 正确匹配。
  • 代码编辑器语法高亮:在 JavaScript、CSS 或模板字符串中验证括号、引号是否成对。
  • 表达式求值 :如解析 JSON、计算算术表达式(如 (1 + 2) * 3)时,需先验证括号有效性。

问题核心在于 顺序匹配 :后出现的左括号需先匹配右括号,这天然契合 栈(Stack) 的 LIFO(后进先出)特性。因此,栈是最优数据结构选择。

3. 解题思路

解决此问题主要有两种思路:暴力替换法和栈方法。栈方法是最优解,因其时间复杂度和代码可读性俱佳。

3.1 暴力法(替换法)

  • 思路 :不断循环替换字符串中成对的括号(如 "()""[]""{}")为空字符串,直到字符串不再变化。若最终字符串为空,则有效;否则无效。
  • 复杂度:时间复杂度 O(n^2)(每次替换可能需遍历整个字符串),空间复杂度 O(1)。效率低,不推荐用于生产环境。

3.2 栈方法(最优解)

  • 思路:遍历字符串,使用栈存储左括号;遇到右括号时,检查栈顶左括号是否匹配。若匹配则弹出栈顶,继续;否则无效。遍历结束后,栈应为空才有效。
  • 复杂度:时间复杂度 O(n),空间复杂度 O(n)(最坏情况栈存储所有字符)。这是最优解,因其一次遍历即可解决。

4. 代码实现

4.1 暴力法实现

javascript 复制代码
function isValid(s) {
    while (s.includes('()') || s.includes('[]') || s.includes('{}')) {
        s = s.replace('()', '').replace('[]', '').replace('{}', '');
    }
    return s === '';
}

4.2 栈方法实现

javascript 复制代码
function isValid(s) {
    const stack = [];
    const map = {
        '(': ')',
        '[': ']',
        '{': '}'
    };
    
    for (let char of s) {
        if (map[char]) {
            // 左括号入栈
            stack.push(char);
        } else {
            // 右括号检查匹配
            const top = stack.pop();
            if (map[top] !== char) {
                return false;
            }
        }
    }
    
    // 栈为空表示所有括号匹配
    return stack.length === 0;
}

5. 复杂度与优缺点对比

思路 时间复杂度 空间复杂度 优点 缺点 适用场景
暴力法 O(n^2) O(1) 代码简单,无需额外数据结构 效率低,字符串替换开销大 小规模数据或学习演示
栈方法 O(n) O(n) 高效,一次遍历;易于扩展 需额外空间存储栈 生产环境,如前端解析、编辑器校验

6. 总结

实际应用场景:

  • 前端框架:Vue/React 的模板编译时,需检查标签和指令的括号匹配。
  • 构建工具:Babel、Webpack 在解析 JavaScript AST 时,依赖括号验证。
  • 开发工具:VS Code、Chrome DevTools 的代码调试器实时检测语法错误。
  • 表单验证:复杂表达式输入(如规则引擎)需确保括号正确。
相关推荐
2301_800256119 分钟前
B+树:数据库的基石 R树:空间数据的索引专家 四叉树:空间划分的网格大师
数据结构·数据库·b树·机器学习·postgresql·r-tree
独自破碎E9 分钟前
【队列】按之字形顺序打印二叉树
leetcode
mjhcsp11 分钟前
C++ KMP 算法:原理、实现与应用全解析
java·c++·算法·kmp
lizhongxuan12 分钟前
Manus: 上下文工程的最佳实践
算法·架构
码农幻想梦15 分钟前
第九章 高级数据结构
数据结构
AlenTech16 分钟前
206. 反转链表 - 力扣(LeetCode)
数据结构·leetcode·链表
踩坑记录16 分钟前
leetcode hot100 438. 找到字符串中所有字母异位词 滑动窗口 medium
leetcode·职场和发展
CS创新实验室24 分钟前
《计算机网络》深入学:海明距离与海明码
计算机网络·算法·海明距离·海明编码
WW_千谷山4_sch27 分钟前
MYOJ_10599:CSP初赛题单10:计算机网络
c++·计算机网络·算法
大厂技术总监下海32 分钟前
用户行为分析怎么做?ClickHouse + 嵌套数据结构,轻松处理复杂事件
大数据·数据结构·数据库