5.4 删除字符串中的所有相邻重复项(LC1047-E)

算法:

相对于20. 有效的括号 (opens new window)来说其实也是匹配问题,20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。

本题也是用栈来解决的经典题目。

那么栈里应该放的是什么元素呢?

我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?

比如“abbaca”

所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。如果栈里有相同的元素,就pop该元素。

从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。

实际操作:

可以直接用字符串模拟栈,这样就不用再转换了。不过python中字符串不可变,所以可以用列表模拟栈,最后再转成字符串。这样也就不需要反转了。

python可以使用列表(List)来实现栈的功能(没有直接的表示栈的代码)。列表的 `append()` 方法可以用于将元素入栈,`pop()` 方法可以用于将元素出栈。这样,我们可以使用列表的末尾作为栈的顶部。

调试过程:

class Solution:def removeDuplicates(self, s: str) -> str:stack = []for item in s:#若栈顶等于item,则要消除#栈顶用stack[-1]表示,写得时候就要想到,前提是stack非空if stack and stack[-1] == item:stack.pop()else:stack.append(item)#最后要返回一个字符串,可以用join函数return "".join(stack)

原因:`return` 语句的位置不正确。它应该放在 `for` 循环的外部,以便在遍历完整个字符串后返回最终的结果。

正确代码:

class Solution:def removeDuplicates(self, s: str) -> str:stack = []for item in s:#若栈顶等于item,则要消除#栈顶用stack[-1]表示,写得时候就要想到,前提是stack非空if stack and stack[-1] == item:stack.pop()else:stack.append(item)#最后要返回一个字符串,可以用join函数return "".join(stack)

时间空间复杂度:

  • 时间复杂度:O(n),其中 n 是输入字符串的长度。代码通过一次遍历字符串(for循环),对每个字符进行入栈和出栈操作,所以时间复杂度是线性的。

  • 空间复杂度:O(n),其中 n是输入字符串的长度。在最坏情况下,当输入字符串中的字符都不相同时,栈的大小将达到输入字符串的长度。因此,空间复杂度与输入字符串的长度成正比。

对于 `return "".join(stack)` 这行代码,复杂度的计算方式如下:

时间复杂度:O(n),其中 n 是最终生成的字符串的长度。`join()` 函数需要遍历栈中的字符并将它们逐个拼接起来,所以时间复杂度与最终生成的字符串的长度成正比。 

空间复杂度:O(n),其中n是最终生成的字符串的长度。在拼接字符串时,`join()` 函数会创建一个新的字符串对象,并将栈中的字符逐个复制到新的字符串中。因此,空间复杂度与最终生成的字符串的长度成正比。

需要注意的是,`join()` 函数的空间复杂度只考虑了最终生成的字符串所占用的额外空间,而不包括栈 `stack` 的空间。栈 `stack` 的空间复杂度已经在之前的回答中进行了说明,它是 O(n),其中 n是输入字符串的长度。 因此,总的空间复杂度可以看作是 O(n),其中 n是最终生成的字符串的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

安全防御——二、ENSP防火墙实验学习

安全防御 一、防火墙接口以及模式配置1、untrust区域2、trust区域3、DMZ区域4、接口对演示 二、防火墙的策略1、定义与原理2、防火墙策略配置2.1 安全策略工作流程2.2 查询和创建会话 3、实验策略配置3.1 trust-to-untrust3.2 trust-to-dmz3.3 untrust-to-dmz 三、防火墙的区域…

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…

思维模型 霍布森选择效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。这是一个设计好的陷阱&#xff0c;也许你认为你有选择&#xff0c;然后冥冥之中你的选择却很少&#xff0c;尽在所谓的“命运”掌握之中。 1 霍布森选择效应的应用 1.1 iphone的营销策略之…

chrome好用的阅读工具【推荐】

1、插件名称&#xff1a;Circle 下载地址&#xff1a; circlereader.com/ Circle 可以提取网页中的内容信息&#xff0c;并进行重新排版&#xff0c;是浏览文章、新闻等内容的神器 看各大网站VIP &#xff1a; 2、油猴&#xff1a; 下载地址&#xff1a; https://www.tampe…

Docker Swarm实现容器的复制均衡及动态管理:详细过程版

Swarm简介 Swarm是一套较为简单的工具&#xff0c;用以管理Docker集群&#xff0c;使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口&#xff0c;换言之&#xff0c;各种形式的Docker Client(dockerclient in go, docker_py…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

【Spring Security】Spring Security 认证过程源码分析

项目启动 我们在前面有了解到可以在application.yml中配置用户名密码,那么可以猜想:肯定是在项目启动的时候加载的,我们通过鼠标点击 进入SecurityProperties,我们在User中的getName上打断点,这样项目启动的时候就可以走到这里 之后我们通过点击:Drop Frame可以往回走进…

【带头学C++】----- 三、指针章 ---- 3.5 字符串与指针

在 C 中&#xff0c;字符串可以通过指针来表示和操作。C 的字符串是由字符组成的字符数组&#xff0c;而指针则用于引用和操作内存中的数据。 1. 字符数组 1. 字符数组: 字符数组是最基本的字符串表示方式。可以使用字符数组来存储字符串&#xff0c;并使用指针来引用它。字符…

若依笔记(三):权限控制与数据隔离

目录 数据隔离/权限控制 用户/权限/部门/岗位 ​数据隔离 mybatis的maaper写法 注解和切面 前端路由拦截 已知若依单体的前端采用vue-element-admin&#xff0c;在前端的专栏系列vue-element-admin的动态路由已详细拆解&#xff0c;其最大特点是使用后端返回数据控制前端…