首页 > 其他分享 >有效的括号(字节面试题 最优解)

有效的括号(字节面试题 最优解)

时间:2024-12-14 22:57:12浏览次数:6  
标签:面试题 匹配 字节 top 栈顶 括号 字符串 false

题目来源

20. 有效的括号 - 力扣(LeetCode)


题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

提示:

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

题目限制

要求最优解 

不能暴力


思路分析

这题可以用栈这种数据结构来解决,以下是思路提示:

首先,遍历给定的字符串。

当遇到左括号(也就是 '('、'{'、'[' 这几种)的时候,把它们依次压入栈中。因为后续要靠它们来匹配对应的右括号嘛。

而一旦遇到右括号(')'、'}'、'[' )时,就去检查栈顶元素。如果栈为空,那说明没有可以匹配的左括号了,直接返回 false ;要是栈不为空,就看看栈顶的左括号和当前遇到的右括号是不是同一类型的(比如栈顶是 '(',当前是 ')' ,这就是同一类型能匹配上的情况),如果是同一类型,那就把栈顶元素弹出,表示这个括号对匹配上了;要是类型不同,那就不符合要求,直接返回 false 。

最后,当整个字符串都遍历完了,如果栈为空,那就说明所有括号都匹配上了,字符串是有效的,返回 true,要是栈里还有元素,那就意味着有左括号没匹配到右括号,返回 false 。

利用栈来处理的好处在于它能很好地按照顺序来记录和匹配括号,符合括号匹配的先后顺序规则,时间复杂度相对比较优哦。大家可以顺着这个思路再详细去思考具体的实现啦。


具体代码

class Solution {
public:
    bool isValid(string s) {
        stack <char> a;
        for(auto i:s)
        {
            if(i=='('||i=='{'||i=='[')a.push(i);
            else 
            {
                if(a.empty())return false;
                else
                {
                char top=a.top();
                if((top=='('&&i==')')||(top=='{'&&i=='}')||(top=='['&&i==']'))a.pop();
                else{return false;}
                }
            }
        }return a.empty();
    }
};

在上述代码中,我们使用了std::stack(栈)这个容器来辅助我们解决问题。首先,我们遍历输入的字符串 s。当遇到左括号('(''{''[')时,我们将其压入栈 a 中。而当遇到右括号时,我们首先检查栈是否为空,如果为空,那就意味着没有对应的左括号来匹配这个右括号,所以直接返回 false。如果栈不为空,我们获取栈顶元素 top,然后检查栈顶的左括号和当前的右括号是否是匹配的类型(例如 '(' 和 ')' 匹配、'[' 和 ']' 匹配、'{' 和 '}' 匹配),如果是匹配的,我们就将栈顶元素弹出,表示这一对括号已经成功匹配;如果不匹配,那么就说明字符串中的括号不是有效的,直接返回 false。当整个字符串都遍历完后,如果栈为空,那就说明所有的括号都找到了对应的匹配括号,字符串是有效的,返回 true;否则返回 false

这种利用栈来解决括号匹配问题的方法,充分利用了栈的后进先出(LIFO)特性,能够高效且准确地判断字符串中括号的有效性。通过这个问题,我们不仅加深了对栈数据结构的理解,也提升了我们解决实际编程问题的能力。

 


注意事项

解题思路在编程学习中占据着举足轻重的地位。就拿本题来说,关键在于确定运用何种算法予以攻克。多数人起初往往只会盲目地尝试各种括号匹配方式,然而这毫无成效。若无法洞悉解题的核心思路,个人的编程能力将永远停滞不前。刷题的意义绝非仅仅局限于用代码实现某个题目,更为关键的是要深刻领悟其背后的解题思路,而这其中的核心要素便是算法。它宛如一盏明灯,能够穿透问题的重重迷雾,引导我们找到高效且准确的解决方案,从而在编程的学习之路上实现真正的成长与突破。

标签:面试题,匹配,字节,top,栈顶,括号,字符串,false
From: https://blog.csdn.net/ajsjnnn/article/details/144478037

相关文章

  • 2025年最新完整java面试题(含答案)
    1**、面向对象的特征有哪些方面****【基础】**答:面向对象的特征主要有以下几个方面:1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一......
  • 腾讯技术岗位笔试&面试题(四)
    说在前面本篇文章是腾讯技术面试题目汇总第四篇。后续将持续推出互联网大厂,如阿里,腾讯,百度,美团,头条等技术面试题目,以及答案和分析。欢迎大家点赞关注转发。原文链接:https://mp.weixin.qq.com/s/9EpKvEJECIh6rrd_Kqdfkw1.__stdcall和__cdecl的区别?__stdcall__stdcall是函......
  • C++面试题总结---操作系统(1)
    Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。1.查看进程运行状态的指令:ps命令。“ps-aux|grepPID”,用来查看某PID进程状态2.查看内存使用情况的指令:free命令。“free-m”,命令查看内存使用情况。3.tar解压文件的参数:五个命令中必......
  • C#经典算法面试题
    1.递归算法1.1C#递归算法计算阶乘的方法一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。原理:亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。 ///<summary......
  • 中高级运维工程师运维面试题(一)之JVM
    这里写目录标题问题1:什么是堆?它在JVM中的作用是什么?问题2:堆中有哪些内容?问题3:什么是Eden区、Survivor区,年轻代和老年代的作用分别是什么?问题4:什么是GC?有哪些常见的垃圾回收器?问题5:栈是什么?与堆有什么区别?问题6:如何优化堆和栈?问题7:简述FullGC的触发条件以及如何优......
  • 工作三年,字节让我java转go,怎么选择?
    在面临从Java转向Go的语言选择时,以下是一些考虑因素,可以帮助你做出决定:技术栈匹配:灵动Ai:了解灵动Ai的技术栈和项目需求。如果Go在该公司的项目中更为常见或更受青睐,那么转向Go可能会对你的职业发展更有利。个人兴趣和擅长领域:考虑你对Java和Go哪一种语言有更大的兴趣。......
  • 网络字节序本地字节序点分十进制转换函数总结&&两种初始化socket并bind的步骤
    网络字节序本地字节序点分十进制转换函数总结&&两种初始化socket并bind的步骤文章目录网络字节序本地字节序点分十进制转换函数总结&&两种初始化socket并bind的步骤1.网络字节序、本地字节序和点分十进制的数据长啥样1.点分十进制2.本地字节序(主机字节序)和网络字节序3.......
  • Java实习常见面试题(一)
    1.==与equals的区别==在比较基本数据类型时比较的是值,在比较引用类型时比较的是内存地址equals在重写之后比较的是值,在不重写时比较的是地址equals不能比较基本数据类型2.StringStringbufferStringBuilder区别String是final修饰的常量对象内容不可变StringBufffer对方......
  • 全网最强Java面试题(全网最全、最细、附答案)
    1、悲观锁、乐观锁和分布式锁的实现和细节悲观锁:认为线程安全问题一定会发生,所以在操作数据之前先获取锁,保证线程串行执行,例如synchronized,lock细节:悲观锁适合插入数据锁的粒度要尽量小,只锁住需要串行执行的代码配合事务使用时,要先提交事务再释放锁乐观锁:认为线程安......
  • 火爆Github的1000道Java面试题
    开篇小叙现在Java面试可以说是老生常谈的一个问题了,确实也是这么回事。面试题、面试宝典、面试手册......各种Java面试题一搜一大把,根本看不完,也看不过来,而且每份面试资料也都觉得Nice,然后就开启了收藏之路。Java开发者应该是不会很容易满足的,现在拿着20K的工作,下一步就想着......