zl程序教程

您现在的位置是:首页 >  Python

当前栏目

北大陈斌Python算法笔记(二)

2023-02-19 12:28:53 时间

前言

?作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 ?个人主页:红中 ?不就是蓝桥杯嘛,干他!!我堂堂 

 栈的应用:简单括号匹配

首先说到括号,就是那种数学运算或者是逻辑运算中非常简单的括号

这玩意的使用呢,必须遵循某种规则,即“平衡”

说白了,就是括号必须得是一对,重点不在前面的“一”上,而是在“对”上

 明白了吧,有开就有闭,有左就有右

那么我们应该如何构造括号匹配识别算法

首先遇到一串带有多个括号的代码,我们应先将无关的部分摘除掉,只留下括号,来分析逻辑

接下来我们从左到右来分析

 最先遇到的是左侧第一个括号,那么它所对应的,是右侧最后一个括号,这也正好符合了我们之前说的

次序反转

的识别,这正巧符合栈的特性

接下来呢,我们来看一道题

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

有效字符串需满足:

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


示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false


提示:

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

 直接分析代码 

作者:shen-du-xue-xi-s 链接:https://leetcode.cn/problems/valid-parentheses/solution/by-shen-du-xue-xi-s-q3ul/ 来源:力扣(LeetCode)

class Solution:
    def isValid(self, s: str) -> bool:
        #用字典来存储括号对,键是左括号,值是右括号
        dic = {   '(':')',    '[':']',   '{': '}'  }
        #构造辅助栈
        stack = []
        #开始遍历每一个括号,只将左括号入栈,当下一次入栈的是 栈顶元素相对应 的右括号时,把栈顶元素出栈;如果不是,则直接返回False
        for i in s:
            #如果是左括号,则入栈
            if i in dic:
                stack.append(i)
            #如果是右括号且栈不为空,判断栈顶元素(stack[-1])是否与当前要入栈的元素(i)相匹配
            elif stack:
                #如果匹配,把栈顶元素出栈
                if dic[ stack[-1] ] == i:
                    stack.pop()
                #如果不匹配,则直接返回False
                else:
                    return False
            #如果右括号且栈为空,肯定不匹配,直接返回False
            else:
                return False

        #如果最后栈中元素为空,说明为有效括号,返回True
        if len(stack) == 0:
            return True
        #否则返回False
        else:
            return False

 来看下这串代码

    def isValid(self, s: str) -> bool:

 这个其实是python3的新特性,传入的形参为s,而“:”后面的str为注释

之所以叫做注释,是因为即使这玩意写的是str,还是能传入一个int进去且不报错(前提是代码内部能够正确处理,而后面的bool,则是对return返回值的注释

思路大体就是,在字符串中选择匹配的括号,先将左括号添加至栈顶,然后选择右括号

如果栈不空,则这一对括号成功匹配

如若在匹配到右括号时,栈为空,则说明这右括号是多余的,不符合平衡原则

如若在全部选择完之后发现栈不空,里面还有剩余的左括号,则说明这左括号是多余的,不符合平衡原则

当然,在HTML/XML这种层次结构化文档的校验,操作,也可以通过栈来实现