【每日算法】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 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
洛卡卡了1 天前
我们在用 AI 写代码时,为什么建议要好好维护 AGENTS.md 呢?
面试·agent·claude
PBitW1 天前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
自由路飞1 天前
RAG 混合检索深挖:BM25 和向量分数为什么不能直接相加?
面试
未秃头的程序猿1 天前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
阳光是sunny2 天前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构