有效的括号,python,力扣,栈数据结构

news2024/12/27 12:49:41

一、题目描述

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

有效字符串需满足:

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

示例 1:

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

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

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

提示:

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

二、题解

解1:普通方法(通过10%的测试用例)

class Solution:
    def isValid(self, s: str) -> bool:
        flag = 0
        l = len(s)
        for i in range(0,l,2):
            if  s[i] == '(' and s[i+1]==')':
                flag += 1
            if  s[i] == '[' and s[i+1]==']':
                flag += 1
            if  s[i] == '{' and s[i+1]=='}':
                flag += 1
        
        if flag == l//2:
            return True
        else:
            return False
      

 

 

解2:使用字典计数(通过80%的测试用例)

class Solution:
    def isValid(self, s: str) -> bool:
 
        dict = {
            "(":0,
            ")":0,
            "{":0,
            "}":0,
            "[":0,
            "]":0
        }
        for i in range(len(s)):
            dict[s[i]]+=1
        if dict["("] == dict[")"] and  dict["["] == dict["]"] and  dict["{"] == dict["}"]:
            return True
        else:
            return False
        

        

 

 

解3:使用栈数据结构的性质(通过所有测试用例)

class Solution:
    def isValid(self, s: str) -> bool:
        # 创建一个字典,其中键为右括号,值为对应的左括号
        dic = {')':'(',']':'[','}':'{'}
        # 创建一个空栈用于存储左括号
        stack = []
        # 遍历输入的字符串中的每个字符
        for i in s:
            # 如果栈不为空且当前字符是右括号
            if stack and i in dic:
                # 检查栈顶元素是否与当前字符所对应的左括号匹配
                if stack[-1] == dic[i]:
                    # 如果匹配,将栈顶的左括号出栈
                    stack.pop()
                else:
                    # 如果不匹配,返回False,表示括号无效
                    return False
            else:
                # 如果栈为空或者当前字符是左括号,将当前字符压入栈中
                stack.append(i)
        # 最后,判断栈是否为空,为空则表示括号有效,返回True,否则返回False
        return not stack

解4使用链表栈完成题解(通过100%)

当然,我可以给你提供一个使用链表实现栈的解决方案,以判断字符串是否有效。

首先,我们需要定义一个链表节点类 `Node` 来表示栈中的每个节点。每个节点包含一个值和指向下一个节点的指针。

```python
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
```

然后,我们定义链表栈类 `Stack` 来实现栈的基本操作。栈中有两个重要的属性:栈顶节点 `top` 和栈的大小 `size`。栈的大小可以帮助我们判断是否为空栈。

```python
class Stack:
    def __init__(self):
        self.top = None
        self.size = 0

    def push(self, value):
        new_node = Node(value)
        if not self.top:
            self.top = new_node
        else:
            new_node.next = self.top
            self.top = new_node
        self.size += 1

    def pop(self):
        if self.isEmpty():
            return None
        else:
            popped_value = self.top.value
            self.top = self.top.next
            self.size -= 1
            return popped_value

    def isEmpty(self):
        return self.size == 0
```

现在,我们可以使用链表栈来判断字符串的有效性。遍历字符串的每个字符,当遇到左括号时,将其入栈;当遇到右括号时,判断栈是否为空,或者栈顶的左括号与当前右括号不匹配,则返回 False。最后,检查栈是否为空,如果为空,则表示所有的括号都有效,返回 True。

```python
def isValid(s):
    stack = Stack()
    mapping = {')': '(', ']': '[', '}': '{'}
    for char in s:
        if char in ['(', '[', '{']:
            stack.push(char)
        elif char in [')', ']', '}']:
            if stack.isEmpty() or stack.pop() != mapping[char]:
                return False
    return stack.isEmpty()
```

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

class Stack:
    def __init__(self):
        self.top = None
        self.size = 0

    def push(self, value):
        new_node = Node(value)
        if not self.top:
            self.top = new_node
        else:
            new_node.next = self.top
            self.top = new_node
        self.size += 1

    def pop(self):
        if self.isEmpty():
            return None
        else:
            popped_value = self.top.value
            self.top = self.top.next
            self.size -= 1
            return popped_value

    def isEmpty(self):
        return self.size == 0

class Solution:
    def isValid(self, s: str) -> bool:
        stack = Stack()
        mapping = {')': '(', ']': '[', '}': '{'}
        for char in s:
            if char in ['(', '[', '{']:
                stack.push(char)
            elif char in [')', ']', '}']:
                if stack.isEmpty() or stack.pop() != mapping[char]:
                    return False
        return stack.isEmpty()

 

 

 三、知识点扩展

在Python中,栈可以使用以下两种方式实现:

1. 列表(List)实现栈:
   Python的内置类型列表(List)可以方便地用作栈数据结构。可以使用`append()`方法将元素添加到列表的末尾,使用`pop()`方法从列表的末尾移除元素。

   示例代码:
 

  ```python
   stack = []  # 创建一个空栈
   stack.append(1)  # 入栈操作
   stack.append(2)
   stack.append(3)
   top_element = stack.pop()  # 出栈操作,返回被弹出的元素
   print(top_element)  # 输出: 3
   ```

2. 链表(LinkedList)实现栈:
   如果想要更加灵活地实现栈,还可以使用自定义的链表结构来实现。链表实现栈的主要优点是在入栈和出栈操作中具有 O(1) 的时间复杂度。   示例代码:
 

 ```python
   class Node:
       def __init__(self, val):
           self.val = val
           self.next = None

   class Stack:
       def __init__(self):
           self.top = None

       def push(self, val):
           new_node = Node(val)
           new_node.next = self.top
           self.top = new_node

       def pop(self):
           if self.isEmpty():
               return None
           popped_val = self.top.val
           self.top = self.top.next
           return popped_val

       def isEmpty(self):
           return self.top is None

   stack = Stack()  # 创建一个空栈
   stack.push(1)  # 入栈操作
   stack.push(2)
   stack.push(3)
   top_element = stack.pop()  # 出栈操作,返回被弹出的元素
   print(top_element)  # 输出: 3
   ```

使用列表实现栈更为简单和高效,因此在Python中通常更常用。但是,当需要更多灵活性和控制时,可以选择实现自己的链表结构作为栈。

希望这个回答对你有所帮助。如果有任何进一步的问题,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/786646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生网关部署新范式丨 Higress 发布 1.1 版本,支持脱离 K8s 部署

作者&#xff1a;澄潭 版本特性 Higress 1.1.0 版本已经 Release&#xff0c;K8s 环境下可以使用以下命令将 Higress 升级到最新版本&#xff1a; kubectl apply -f https://github.com/alibaba/higress/releases/download/v1.1.0/customresourcedefinitions.gen.yaml helm …

23款奔驰GLE350轿跑更换原厂几何多光束大灯,让智能照亮您的美

奔驰几何多光束大灯核心特点就是通过内部的84颗可独立控制的LED光源&#xff0c;行车远光灯会甄别对向驶来的车辆或者行人&#xff0c;并且动态的跟随目标&#xff0c;之后阴影话该区域&#xff0c;避免晃到车辆和行人。

mysql如何进行集群化部署

mysql如何进行集群化部署 MySQL的集群化部署是一种将数据库服务器组织成一个高可用性、高性能的集群的方法。下面将详细介绍MySQL集群化部署的步骤和相关概念。 数据库集群基础知识&#xff1a; 主节点&#xff08;Master&#xff09;&#xff1a;负责处理写操作和数据更新的节…

代码随想录算法训练营第二十三天 | 额外题目系列

额外题目 1365. 有多少小于当前数字的数字借着本题&#xff0c;学习一下各种排序未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 941.有效的山脉数组未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 1207. 独一…

react native远程调试js(无法打开)

解决方案一&#xff1a; 因为chrome inspect需要加载 https://chrome-devtools-frontend.appspot.com 上的资源&#xff0c;所以需要FQ。 GoogleChrome/ADBPlugin#14 解决方案二&#xff1a; 编辑hosts文件&#xff0c;添加&#xff1a; 61.91.161.217 chrome-devtools-f…

【Seata】微服务集成seata

文章目录 1、Seata介绍2、Seata架构3、部署TC服务4、微服务集成seata 1、Seata介绍 Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。 官网http://seata.io/ 2、Seata架构 Seata事务管理有三个角色&#xff1a; TC (Transaction Coordinator) - 事务…

使用rt-thread Studio下载固件时出现Unable to enter Isp mode

根据 我发现我缺了图中的文件夹 解决方法: 在rt-thread studio的sdk管理包中下载

Java阶段五Day12

Java阶段五Day12 文章目录 Java阶段五Day12问题解析顺序消息事务消息 Rocket核心概念KeysTags Springboot整合RocketMQ案例使用准备案例环境生产端发送消息消费端&#xff08;push&#xff09;异步下单操作Business生产端Order消费端Order-adapter整合 rocketmq消费逻辑步骤获取…

【Spring Boot丨(11 )】json的集成

集成JSON 概述JacksonGsonJSON-B 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Spring boot 提供了三种json库的集成&#xff1a; GsonJacksonJSON-B 上述三种库提供了将Java对象转换为JSON字符串以及将JSON字符串转换为Java对象的功能。 其中Jackson 是 Spring Boot 官方…

IDEA常用高效开发工具—screw一键生成数据库文档(仅需三步)

1.配置 引入screw核心... <!-- screw核心 --> <dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.3</version> </dependency><!-- HikariCP --> <dependency…

Spring Boot 缓存 Cache 入门

Spring Boot 缓存 Cache 入门 1.概述 在系统访问量越来越大之后&#xff0c;往往最先出现瓶颈的往往是数据库。而为了减少数据库的压力&#xff0c;我们可以选择让产品砍掉消耗数据库性能的需求。 当然也可以引入缓存,在引入缓存之后&#xff0c;我们的读操作的代码&#xff…

考了个试,我扯下了理论式数据治理的遮羞布

事情要从2023年618CDGP考试说起 ...... 在全国人民都在欢天喜地剁手的时候&#xff0c;没错&#xff0c;我正在紧张的进行2023年第3期的CDGP考试。 而7月7日&#xff0c;就是放榜的日子。以dama中国的尿性&#xff0c;都是卡在第三周周五的最后一刻才会放榜。于是&#xff0…

SQL SUM() 函数

SUM() 函数返回数值列的总数。 SQL SUM() 语法&#xff1a; SELECT SUM(column_name) FROM table_name WHERE condition; column_name 是要计算总和的列名。 table_name 是包含要计算总和的列的表的名称。 WHERE 子句可选&#xff0c;用于指定要计算总和的行的条件。 演示…

动量定理不愧是大师都在推荐使用的交易策略

动量定理对交易策略的重要性不言而喻&#xff0c;许多交易大师都在推荐使用。Forexclub认为它可以通过观察趋势的持续时间来预测价格走势&#xff0c;使用振荡器来确定趋势支点&#xff0c;这个振荡器比标准振荡器更快&#xff0c;能够提前给出买卖信号。该振荡器由两条线组成&…

【Vue】vue3 v-draggable 拖拽指令封装

说明 需求&#xff1a;实现一个拖拽指令&#xff0c;可在父元素区域任意拖拽元素&#xff0c;同时如果传入的值为 father&#xff0c;则拖拽的时候以父元素为拖拽对象 思路&#xff1a; 1、设置需要拖拽的元素为absolute&#xff0c;其父元素为relative。 2、鼠标按下(onmous…

最新MPAS跨尺度、可变分辨率模式

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

观察者模式(java)

目录 结构 案例 代码实现 抽象观察者 抽象主题类 具体观察者 具体主题类 测试类 优缺点 优点 缺点 结构 在观察者模式中有如下角色&#xff1a; Subject&#xff1a;抽象主题&#xff08;抽象被观察者&#xff09;&#xff0c;抽象主题角色把所有观察者对象保存在一个…

C语言每天一练----输出水仙花数

题目&#xff1a;请输出所有的"水仙花数" 题解&#xff1a;所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…

【Spring】ApplicationEventPublisher 发布订阅模式

概念 关于发布订阅这个词&#xff0c;其实不仅仅出现在Spring框架当中&#xff0c;其实在Redis中也有存在&#xff08;其对应的是convertAndSend()方法&#xff09;&#xff0c;还有在MQ消息队列里也是有的&#xff0c;但这里就主要介绍的是关于Spring框架的ApplicationEventPu…

数据库管理-第九十四期 19c OCM之路-第四堂(02)(20230725)

第九十四期 19c OCM之路-第四堂&#xff08;02&#xff09;&#xff08;20230725&#xff09; 第四堂继续&#xff01; 考点3&#xff1a;SQL statement tuning SQL语句调优 收集Schema统计信息 exec dbms_stats.gather_schems_stats(HR);开启制定表索引监控 create index…