第二题:有效的括号--栈

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。
    示例 1:
    输入:s = “()”
    输出:true
    示例 2:
    输入:s = “()[]{}”
    输出:true
    示例 3:
    输入:s = “(]”
    输出:false
    方法一:栈
    算法思想:
    这种算法思想的基本思路是利用栈的后进先出(LIFO)特性,当遇到左括号时,就把与之对应的右括号压入栈中,而当遇到右括号时,则进行字符匹配。如果栈为空或者栈顶元素与右括号不相等,则说明此时字符不匹配。直接返回false;否则说明该字符就是与栈顶元素进行匹配的字符,直接出栈即可。最后,在算法开始之前可以先进行剪枝操作。因为进行字符匹配,如果匹配成为则说明字符的数量为偶数,若为奇数一定不匹配!
    算法步骤:

Step1:判断字符串的长度是奇数,则直接返回False,然后创建一个空栈和一个括号匹配的哈希map用于存储对应的括号。
Step2:遍历字符串的每个字符:
如果当前字符是左括号(‘(’,‘{’ 或 ‘[’),则将其压入栈中。
如果当前字符是右括号(‘)’,‘}’ 或 ‘]’),则进行匹配判断:
如果栈为空,或者栈顶元素不是与当前字符匹配的左括号,则返 回 False。
如果栈顶元素是与当前字符匹配的左括号,则将栈顶元素出栈,继续处理下一个字符。
Step3:在遍历结束后,如果栈为空,则返回 True;否则,返回 False。

代码程序(Python):


    def isValid(self, s):
        stack = []
        mapping = {'(': ')', '[': ']', '{': '}'}

        if len(s) % 2 != 0:
            return False
            
        for char in s:
            if char in mapping:
                # char是左括号,就把对应的右括号压入栈中
                stack.append(mapping[char])
            else:
                # char是右括号,需要进行判断,栈是否为空或者栈顶元素stack[-1]是否和char进行匹配
                if not stack or stack[-1] != char:
                    return False
                else:
                    stack.pop()

        return not stack

算法测试:

在这里插入图片描述

算法时间空间复杂度分析:
使用 Python 函数的时间复杂度分析:

遍历输入字符串需要 O(n) 的时间,其中 n 是字符串的长度。
在遍历过程中,对于每个字符,我们需要执行一些操作,如查找哈希表中的映射关系、栈的入栈和出栈操作,这些操作的时间复杂度都是 O(1)。
最终,时间复杂度为 O(n)。
使用 Python 函数的空间复杂度分析:
**使用了一个栈来存储左括号,栈的空间复杂度为 O(n),其中 n 是字符串的长度。
哈希表用于存储括号的映射关系,由于括号的种类是固定的,因此哈希表的空间复杂度是 O(1)。
因此,总的空间复杂度为 O(n)。

代码程序(C++):

    bool isValid(string s){
        unordered_map<char, char> pair = {
                    {'(', ')'}, {'[', ']'}, {'{', '}'}
        };
            stack<char> stk;	

        if(s.size() % 2 != 0)
            return false;
        
        
        for(int i = 0; i < s.size(); i++){
            if(pair.find(s[i]) != pair.end()){
                // 如果字符是左括号,就把对应的右括号加入栈中。 
                stk.push(pair[s[i]]);
            }else{
                //如果字符是右括号,则进行字符匹配
                if(stk.empty() || stk.top() != s[i]){
                    return false;
                }
                stk.pop(); 
            }
        }
        return stk.empty();
    } 

算法测试:

**算法空间时间复杂度分析:

使用 C++ 函数的时间复杂度分析:
遍历输入字符串需要 O(n) 的时间,其中 n 是字符串的长度。
在遍历过程中,对于每个字符,我们需要执行一些操作,如哈希表的查找、栈的入栈和出栈操作,这些操作的时间复杂度都是 O(1)。
最终,时间复杂度为 O(n)。
使用 C++ 函数的空间复杂度分析::
使用了一个栈来存储左括号,栈的空间复杂度为 O(n),其中 n 是字符串的长度。
哈希表用于存储括号的映射关系,由于括号的种类是固定的,因此哈希表的空间复杂度是 O(1)。
因此,总的空间复杂度为 O(n)。

也有其他求解有效括号匹配的算法比如:使用递归、使用一个计数器的,但是使用栈是最常用的解决方法,就不提供其他解题算法了。如果你有兴趣研究这个问题,可以深入的去研究。😊

参考文献:
[1] https://geek-docs.com/python/python-examples/python-stack-lifo.html
[2] https://www.bilibili.com/video/BV1AF411w78g/?spm_id_from=333.337.search-card.all.click&vd_source=526e290f96fb270fa1914cdc0f0b1c73

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaoqiangliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值