【Leetcode栈与队列 232. 有效的括号】C++ 「栈的经典应用」

🎈个人主页:算法诗人
✨收录专栏:算法诗人Leetcode揭秘之旅
🎉欢迎 👍点赞✍评论⭐收藏
🤝希望我的文章能对你们有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗



Leetcode题目链接

20. 有效的括号


一、题目描述

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

有效字符串需满足:

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

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

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

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

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

二、解题思路

首先我们要明确哪些情况不是有效的括号。

  1. 左括号多余
  2. 右括号多余
  3. 左右括号不匹配

这道题可以利用栈的特性来解决,因为判断括号是否匹配就是用最后一次输入的括号和当前的括号来进行匹配判断,这刚好就符合了栈的后进先出的特性。

以下是这道题的解题思路,可以配合着示例代码理解:

  1. 如果括号序列的长度为奇数,直接返回 false,因为奇数长度的括号序列无法匹配。
  2. 使用栈来跟踪括号的匹配情况。遍历字符串中的每个字符。
  3. 如果是左括号(‘(’,‘{’,‘[’),则将对应的右括号压入栈中。
  4. 如果是右括号,检查栈是否为空或者栈顶元素是否匹配当前右括号。如果不匹配,返回 false。
  5. 如果匹配成功,弹出栈顶元素。
  6. 最终,如果栈为空,表示所有括号都匹配成功,返回 true。

三、示例代码

class Solution {
public:
    bool isValid(string s) {
        // 如果字符串长度为奇数,直接返回 false,因为奇数长度的括号序列无法匹配
        if(s.length() % 2 != 0)
        {
            return false;
        }

        // 创建一个栈用于跟踪括号的匹配情况
        stack<char> stack;

        // 遍历字符串中的每个字符
        for(int i = 0; i < s.length(); i++)
        {
            // 如果是左括号,将对应的右括号压入栈中
            if(s[i] == '(')
                stack.push(')');
            else if(s[i] == '{')
                stack.push('}');
            else if(s[i] == '[')
                stack.push(']');
            // 如果是右括号
            else if(stack.empty() || stack.top() != s[i])
                // 如果栈为空或者栈顶元素不匹配当前右括号,返回 false
                return false;
            else
                // 否则,匹配成功,弹出栈顶元素
                stack.pop();
        }

        // 最终,如果栈为空,表示所有括号都匹配成功
        return stack.empty();
    }
};

时间复杂度: O(n)
空间复杂度: O(n)
其中 n 是字符串的长度。

新手可能不理解的代码(其实是我自己学习到的新知识)

1. 为什么在输入左括号 ‘(’ ‘{’ ‘[’ 的时候,压入栈中的却是右括号

这里主要是为了简化逻辑,在判断右括号是否匹配的时候就可以直接判断与栈顶的字符是否相等就可以了。如果压入的就是左括号则需要再进行三个if语句的判断,代码会复杂一些。

结尾碎碎念
“这次的算法解析只是冰山一角,未来我将持续分享更多有趣的算法问题,并提供更深入的解析。如果你对这个系列感兴趣,不要错过即将到来的更新!点赞、关注、收藏,如果有不同的解法欢迎留下你的评论,你们的支持就是我更新的最大动力。让我们一起探索更多算法的奇妙世界,这不仅是为了迎接面试挑战,更是为了成为在编程领域中游刃有余的专家。感谢大家的支持,期待未来更多的相遇和共同成长!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值