【每日算法】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 的代码调试器实时检测语法错误。
  • 表单验证:复杂表达式输入(如规则引擎)需确保括号正确。
相关推荐
触底反弹1 小时前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
kyriewen1 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
wdfk_prog1 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
LayZhangStrive4 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
来一碗刘肉面4 小时前
栈的应用(表达式求值)
数据结构·算法
程序员清风4 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
GitLqr4 小时前
别再盲目复制了:彻底搞懂 CORS 的本质与那些“神坑”
安全·http·面试
xiaowang1234shs5 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室5 小时前
量化研究--策略迁移算法1研究
算法
Web极客码5 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习