当前位置: 首页 > article >正文

【代码随想录】刷题记录(31)-有效的括号

题目描述:

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

有效字符串需满足:

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

 

示例 1:

输入:s = "()"

输出:true

示例 2:

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

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

提示:

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

 

我的作答:

呃呃呃简单题我也写了一个小时,跳楼了。。。。。

class Solution(object):
    def __init__(self):
        self.st = []

    def push(self,x):
        self.st.append(x)

    def pop(self):
        if self.empty():
            return None
        else:
            return self.st.pop()

    def top(self):
        if self.empty():
            return None
        else:
            return self.st[-1]

    def empty(self):
        return not self.st

    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if len(s)%2!=0: #剪枝操作,如果是奇数绝对括号不匹配,但是如果是偶数也不一定匹配:{{
            return False
        for i in range(len(s)):
            if s[i]=='(': #如果是左括号,就给栈推入对应的右括号,便于后面查看是否对应
                self.push(')')
            elif s[i]=='[':
                self.push(']')
            elif s[i]=='{':
                self.push('}')
            elif self.empty() or s[i]!=self.top(): #如果遍历还没结束栈就空了说明左括号多了
                return False                       #如果访问的右括号和栈里的不一样直接返回f
            else:
                self.pop() #表示访问的是s里面的右括号且无异常发生
        return self.empty() #如果栈刚好空了,说明一一对应消去了

只存在三种不匹配的情况:

(1)左括号多了;

(2)左右括号数量相等,但是对应位置存在不匹配的括号;

(3)右括号多了;

由于左右括号在对应的位置必须要对应,根据这个逻辑,当访问一个左括号的时候,储存对应的右括号在栈里,就相当于又储存了括号类型又储存了括号位置,因而当访问s里对应右括号的位置时,此时栈弹出的就是理论上左括号对应的正确右括号类型!

63598560e7944886b5b109667ba4dc99.png

 

参考代码:(啊啊啊啊好简洁)

# 方法一,仅使用栈,更省空间
class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append('}')
            elif not stack or stack[-1] != item:
                return False
            else:
                stack.pop()
        
        return True if not stack else False

7eec36485c504f45925cce3e4e4a9bdc.png

# 方法二,使用字典
class Solution:
    def isValid(self, s) :
        stack = []
        mapping = {
            '(': ')',
            '[': ']',
            '{': '}'
        }
        for item in s:
            if item in mapping.keys():
                stack.append(mapping[item])
            elif not stack or stack[-1] != item: 
                return False
            else: 
                stack.pop()
        return True if not stack else False

e8f632a5e4e14043a71edf5acc62d355.png

 


http://www.kler.cn/a/397788.html

相关文章:

  • 蓝桥杯-洛谷刷题-day3(C++)
  • Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理
  • CentOS7.9 源码编译 FreeSWITCH 1.10.12
  • [Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明
  • Zero、Zero-Offload、Zero-Infinity是什么
  • 第1章: 初识Pillow(PIL)
  • 【星海随笔】ZooKeeper-Mesos
  • 【3D Slicer】的小白入门使用指南五
  • 【ict基础软件赛道】真题-50%openGauss
  • 【CSS】absolute定位的默认位置
  • 在Node.js中如何使用TypeScript
  • 无人装备在巷战中的作用
  • 深入探索AutoDL平台:深度学习GPU算力最佳选择
  • 【NOIP提高组】计算系数
  • 单片机 单片机与液晶实验 实验六
  • Spring Boot框架:网上商城开发新选择
  • C# WPF 记录DataGrid的表头顺序,下次打开界面时应用到表格中
  • 软件设计师 - 第1章 计算机网络概论
  • Spring Boot框架:电商解决方案的创新
  • 泛型11.16
  • “倒时差”用英语怎么说?生活英语口语学习柯桥外语培训
  • 30-集群Backup Restore
  • 【#IEEE独立出版、EI稳定检索##高录用 快见刊 稳检索#】2024健康大数据与智能医疗国际会议(ICHIH 2024,12月13-15日)
  • 【Java知识】Java性能测试工具JMeter
  • node.js下载安装步骤整理
  • Linux基础5-进程控制1(fork创建子进程,写时拷贝,进程退出)