leetcode 面试经典 150 题:有效的括号

ops/2025/3/4 4:39:54/
链接有效的括号
题序号20
题型字符串
解法
难度简单
熟练度✅✅✅

题目

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

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1
输入:s = “()”
输出:true

示例 2
输入:s = “()[]{}”
输出:true

示例 3
输入:s = “(]”
输出:false

示例 4
输入:s = “([])”
输出:true

提示
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

题解

  1. 核心思想:判断括号是否有效,关键在于匹配。我们需要确保每个左括号都能找到对应的右括号,并且它们的顺序是正确的。为此,可以使用(Stack)来实现。
  2. stack
    • 是一种后进先出(LIFO)的数据结构,适合处理括号匹配的问题。
    • 每当遇到左括号时,将其压入中。
    • 每当遇到右括号时,检查顶是否为匹配的左括号。
  3. 复杂度:时间复杂度为O(n),其中 n 是字符串 s 的长度。空间复杂度为O(n),由的大小决定,哈希表的空间是常数项,因为常数项在大O表示法中是可以忽略的。这意味着算法的空间需求主要取决于输入数据的大小,而与字符集的大小无关。
  4. c++ 实现算法
bool isValid(string s) {// 用保存未匹配的左括号stack<char> st;// 使用哈希表存储括号的映射关系//键(Key):右括号,包括 ')'、']' 和 '}'。//值(Value):对应的左括号,包括 '('、'[' 和 '{'。unordered_map<char, char> brackets = {{')', '('},{']', '['},{'}', '{'}};for (char c : s) {// 如果是右括号//在 unordered_map 中,count(key) 用于检查给定的 键key 是否存在于哈希表中//如果 key 存在,返回 1. 如果 键key 不存在,返回 0if (brackets.count(c)) {// 顶字符与右括号的匹配//检查是否为空,或者顶是否与当前右括号的匹配左括号相同//通过 brackets[c] 找到右括号对应的左括号,如果 c 是 ')',brackets[c] 就是 '('。if (!st.empty() && st.top() == brackets[c]) {st.pop(); // 匹配成功,移除} else {return false; // 匹配失败}} else {// 如果是左括号,入st.push(c);}}// 为空表示所有括号都匹配成功return st.empty();
}
  1. 算法推演:

以输入 s = “{[()]}” 为例:

  • 遍历字符 ‘{’:入 st = [‘{’]。
  • 遍历字符 ‘[’:入 st = [‘{’, ‘[’]。
  • 遍历字符 ‘(’:入 st = [‘{’, ‘[’, ‘(’]。
  • 遍历字符 ‘)’: 顶为 ‘(’,匹配成功,弹出顶 st = [‘{’, ‘[’]。
  • 遍历字符’]‘: 顶为 ‘[’,匹配成功,弹出顶 st = [’{']。
  • 遍历字符 ‘}’: 顶为 ‘{’,匹配成功,弹出顶 st = []。

遍历结束,为空,返回 true。

  1. c++ 完整demo
#include <iostream>
#include <stack>
#include <unordered_map>
#include <string>using namespace std;bool isValid(string s) {// 用保存未匹配的左括号stack<char> st;// 使用哈希表存储括号的映射关系//键(Key):右括号,包括 ')'、']' 和 '}'。//值(Value):对应的左括号,包括 '('、'[' 和 '{'。unordered_map<char, char> brackets = {{')', '('},{']', '['},{'}', '{'}};for (char c : s) {// 如果是右括号//在 unordered_map 中,count(key) 用于检查给定的 键key 是否存在于哈希表中//如果 key 存在,返回 1. 如果 键key 不存在,返回 0if (brackets.count(c)) {// 顶字符与右括号的匹配//检查是否为空,或者顶是否与当前右括号的匹配左括号相同//通过 brackets[c] 找到右括号对应的左括号,如果 c 是 ')',brackets[c] 就是 '('。if (!st.empty() && st.top() == brackets[c]) {st.pop(); // 匹配成功,移除} else {return false; // 匹配失败}} else {// 如果是左括号,入st.push(c);}}// 为空表示所有括号都匹配成功return st.empty();
}int main() {string s = "{[()]}";if (isValid(s)) {cout << "true" << endl;} else {cout << "false" << endl;}return 0;
}

数据结构之 { }

  1. 数据结构中的(Stack)是一种遵循“后进先出”(Last In First Out,简称LIFO)原则的有序集合。这意味着最后添加到中的元素会首先被移除。通常用于处理递归调用、函数调用、表达式求值、括号匹配等场景。
  2. 的基本操作包括:
    • (Push):将一个元素添加到的顶部。
    • (Pop):移除并返回顶部的元素。
    • 查看顶元素(Peek 或 Top):返回顶部的元素但不移除它。
    • 检查是否为空(IsEmpty):检查中是否有元素,如果有返回false,否则返回true。
    • 获取的大小(Size):返回中元素的数量。
  3. 可以用数组或链表来实现。数组实现的在空间上是连续的,而链表实现的在空间上可以是非连续的。
  4. 的应用场景:
    • 函数调用:在函数调用时,系统会将函数的参数、返回地址以及局部变量压入中,函数执行完毕后,这些信息会被弹
    • 递归:递归函数的每次调用都会创建一个新的帧,用于存储局部变量和参数。
    • 括号匹配:检查代码中的括号是否正确匹配,可以使用来存储遇到的开括号,并在遇到闭括号时检查是否匹配。
    • 表达式求值:在计算表达式时,可以使用来存储操作数和操作符,以正确计算表达式的值。
    • 回溯算法:在搜索和图算法中,可以用来存储路径,以便在需要时回溯到上一个状态。
  5. 是一种非常基础且重要的数据结构,它在计算机科学和软件开发中有着广泛的应用。

http://www.ppmy.cn/ops/154670.html

相关文章

「全网最细 + 实战源码案例」设计模式——生成器模式

核心思想 生成器模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于分步骤构建复杂对象&#xff0c;允许用户通过控制对象构造的过程&#xff0c;定制对象的组成部分&#xff0c;而无需直接实例化它们的细节。建造者模式特别适合构建具有多种配…

python3+TensorFlow 2.x(四)反向传播

目录 反向传播算法 反向传播算法基本步骤&#xff1a; 反向中的参数变化 总结 反向传播算法 反向传播算法&#xff08;Backpropagation&#xff09;是训练人工神经网络时使用的一个重要算法&#xff0c;它是通过计算梯度并优化神经网络的权重来最小化误差。反向传播算法的核…

vue3第三部分--组件通信

title: 组件通信 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端组件通信 目标&#xff1a;重点学习父子组件与兄弟组件的通信方式&#xff0c;以及插槽的作用与使用方式 父子组件通信 主要是通过props和自定义事件来实现 1.1 父 -> 子通信&#xff08;通过 …

Linux线程安全

文章目录 &#x1f96d;Linux线程互斥进程线程间的互斥相关背景概念互斥锁mutex互斥锁的接口互斥锁实现原理探究 &#x1f34d;可重入VS线程安全概念常见的线程不安全的情况常见的线程安全的情况常见的不可重入的情况常见的可重入的情况可重入与线程安全联系可重入与线程安全区…

9 Spark性能优化_RDD算子调优

9 Spark性能优化_RDD算子调优 1. RDD复用2. 尽早filter3. 读取大量小文件-用wholeTextFiles4. mapPartition和foreachPartition5. filtercoalesce/repartition(减少分区)6. 并行度设置7. repartition/coalesce调节并行度8. reduceByKey本地预聚合9. 使用持久化checkpoint10. 使…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【Paper Tips】随记2-word版快速删除某字符

写paper时随心记录一些对自己有用的skills与tips。 文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 CtrlH一键全文替换2.2.2 录制宏 三、疑问四、总结 一、待解决问题 1.1 问题描述 word中粘贴部分文字时&#xff0c;格式不对时…

Node相关配置迁移

Node相关 安装和配置 官网下载 Node.js — 在任何地方运行 JavaScript 可参考文章 nodejs的安装和全局配置(超详细哦)_全局安装node-CSDN博客 安装完成后检查是否安装成功 node -vnpm -v全局配置环境变量 主要配置的是npm安装的全局模块所在的路径&#xff0c;以及缓存c…