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

LeetCode 2390. 从字符串中移除星号【栈】1347

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个包含若干星号 * 的字符串 s 。

在一步操作中,你可以:

  • 选中 s 中的一个星号。
  • 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。

返回移除 所有 星号之后的字符串。

注意:

  • 生成的输入保证总是可以执行题面中描述的操作。
  • 可以证明结果字符串是唯一的。

示例 1:

输入:s = "leet**cod*e"
输出:"lecoe"
解释:从左到右执行移除操作:
- 距离第 1 个星号最近的字符是 "leet**cod*e" 中的 't' ,s 变为 "lee*cod*e" 。
- 距离第 2 个星号最近的字符是 "lee*cod*e" 中的 'e' ,s 变为 "lecod*e" 。
- 距离第 3 个星号最近的字符是 "lecod*e" 中的 'd' ,s 变为 "lecoe" 。
不存在其他星号,返回 "lecoe" 。

示例 2:

输入:s = "erase*****"
输出:""
解释:整个字符串都会被移除,所以返回空字符串。

提示:

  • 1 <= s.length <= 10^5
  • s 由小写英文字母和星号 * 组成
  • s 可以执行上述操作

方法 O ( n ) O(n) O(n) 用栈维护

用栈维护,遇到星号 * 则弹出栈顶,否则把字符入栈。最后从栈底到栈顶就是答案。

注:题目保证生成的输入总是可以执行题面中描述的操作。

class Solution:def removeStars(self, s: str) -> str:st = []for c in s:if c == '*':st.pop()else:st.append(c)return ''.join(st)
class Solution {public String removeStars(String s) {StringBuilder st = new StringBuilder();for (char c : s.toCharArray()) {if (c == '*') {st.deleteCharAt(st.length() - 1);} else {st.append(c);}}return st.toString();}
}
class Solution {
public:string removeStars(string s) {string st;for (char c : s) {if (c == '*') st.pop_back();else st.push_back(c);}return st;}
};
char* removeStars(char* s) {int top = 0; // 栈顶for (int i = 0; s[i]; i++) {if (s[i] == '*') top--; // 出栈else s[top++] = s[i]; // 入栈(把 s 当栈)}s[top] = '\0';return s;
}
func removeStars(s string) string {st := []rune{}for _, c := range s {if c == '*' {st = st[:len(st)-1]} else {st = append(st, c)}}return string(st)
}
var removeStars = function(s) {const st = [];for (const c of s) {if (c === '*') {st.pop();} else {st.push(c);}}return st.join('');
};
impl Solution {pub fn remove_stars(s: String) -> String {let mut st = vec![];for c in s.bytes() {if c == b'*' {st.pop();} else {st.push(c);}}unsafe { String::from_utf8_unchecked(st) }}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n) ,其中  n n n 为  s s s 的长度。
  • 空间复杂度: O ( n ) O(n) O(n) 或  O ( 1 ) O(1) O(1) 。如果把  s s s 当作栈,则空间复杂度为  O ( 1 ) O(1) O(1) ,见 C 语言。

相关文章:

LeetCode 2390. 从字符串中移除星号【栈】1347

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

springboot文件上传(阿里云oss)

本地存储 使用uuid是为了避免文件名的重复&#xff0c;防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …...

Linux下Nodejs应用service配置

Linux 的 service 命令用于对系统服务进行管理&#xff0c;比如启动&#xff08;start&#xff09;、停止&#xff08;stop&#xff09;、重启&#xff08;restart&#xff09;、查看状态&#xff08;status&#xff09;等。service 命令本身是一个 shell 脚本&#xff0c;它在…...

设计模式-结构型-常用:代理模式、桥接模式、装饰者模式、适配器模式

代理模式 快速入门 代理模式是指在不改变原始类&#xff08;或叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。 比如这段统计性能的代码&#xff1a; public class UserController {//...省略其他属性和方法...private MetricsCollecto…...

用多了编程工具,还是Editplus3最贴心

编程久了&#xff0c;发现越是复杂的编程工具越是烦人&#xff0c;而不是帮助人。 早期Java届是没有统一的IDE的&#xff0c;有些人习惯用文本编辑器&#xff0c;但苦于缺乏提示&#xff0c;有些人从一些渠道用上了JBuilder&#xff0c;但毛病不少&#xff0c;直到Eclipse化解…...

Angular基础学习(入门 --> 入坑)

目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 &#xff08;ViewChild&#xff09; 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …...

吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)

目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥&#xff1f;10、…...

Linux防火墙-常用命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...

C++:STL常用算法随笔

主要的头文件#include <algorithm> < functional> <numeric> 遍历算法&#xff1a; for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...

Python NumPy学习指南:从入门到精通

Python NumPy学习指南&#xff1a;从入门到精通 第一部分&#xff1a;NumPy简介与安装 1. 什么是NumPy&#xff1f; NumPy&#xff0c;即Numerical Python&#xff0c;是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray&#xff0c;并支持大量的数学函…...

Flutter笔记--通知

这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制&#xff0c;在widget树中&#xff0c;每一个节点都可以分发通知&#xff0c;通知会沿着当前节点向上传递&#xff0c;所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(二)

目录 template行 template pre-line template line template syl template syl noblank template char template notext template pre-line notext template syl noblank notext template keeptags ​编辑 template loop number 内联变量 ​编辑 remeber函数 re…...

系统分析师16:系统测试与维护

1 内容概要 2 软件测试类型 2.1 测试类型 动态测试【计算机运行】 白盒测试法&#xff1a;关注内部结构与逻辑灰盒测试法&#xff1a;介于两者之间黑盒测试法&#xff1a;关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…...

详解Java中的堆内存

详解Java中的堆内存 堆是JVM运行数据区中的一块内存空间&#xff0c;它是线程共享的一块区域&#xff08;注意了&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;主要用来保存数组和对象实例等&#xff08;其实对象有时候是不在堆中进行分配的&#xff0c;想要了…...

C++类和对象下详细指南

C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量&#xff0c;特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表&#xff0c;成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...

【瑞昱RTL8763E】音频

1 音乐播放控制 1.1 播放列表更新 文件系统在sd卡中保存header.bin及name.bin两份文件用于歌曲名称的存储。为方便应用层进行歌曲显示及列表管理&#xff0c;可将这两个bin文件信息读取并保存到nor flash中。需要播放指定名称的歌曲时&#xff0c;将对于歌曲名称传递给文件系…...

videojs 播放监控

<head><!-- 1. 引入videojs的CSS。 --><link href"https://vjs.zencdn.net/7.20.3/video-js.css" rel"stylesheet" /><!-- If youd like to support IE8 (for Video.js versions prior to v7) --><!-- <script src"htt…...

电源管理芯片PMIC

一、简介 电源管理芯片&#xff08;Power Management Integrated Circuits&#xff0c;简称PMIC&#xff09;是一种集成电路&#xff0c;它的主要功能是在电子设备系统中对电能进行管理和控制&#xff0c;包括但不限于以下几点&#xff1a; 电压转换&#xff1a;将电源电压转换…...

C++ 线性表、内存操作、 迭代器,数据与算法分离。

线性表&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的 一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和…...

PHP如何解析配置文件

在PHP中解析配置文件有多种方法&#xff0c;具体取决于配置文件的格式。常见的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP数组文件&#xff08;即PHP文件本身包含配置数组&#xff09;。下面是一些常用的方法来解析这些配置文件。 1. 解析INI文件 INI文件是最常见的…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...