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^5s由小写英文字母和星号*组成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」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
springboot文件上传(阿里云oss)
本地存储 使用uuid是为了避免文件名的重复,防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …...
Linux下Nodejs应用service配置
Linux 的 service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。service 命令本身是一个 shell 脚本,它在…...
设计模式-结构型-常用:代理模式、桥接模式、装饰者模式、适配器模式
代理模式 快速入门 代理模式是指在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 比如这段统计性能的代码: public class UserController {//...省略其他属性和方法...private MetricsCollecto…...
用多了编程工具,还是Editplus3最贴心
编程久了,发现越是复杂的编程工具越是烦人,而不是帮助人。 早期Java届是没有统一的IDE的,有些人习惯用文本编辑器,但苦于缺乏提示,有些人从一些渠道用上了JBuilder,但毛病不少,直到Eclipse化解…...
Angular基础学习(入门 --> 入坑)
目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 (ViewChild) 六、组件通讯 七、生命周期 八、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增强了啥?10、…...
Linux防火墙-常用命令
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...
C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric> 遍历算法: for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...
Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...
Flutter笔记--通知
这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过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 测试类型 动态测试【计算机运行】 白盒测试法:关注内部结构与逻辑灰盒测试法:介于两者之间黑盒测试法:关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…...
详解Java中的堆内存
详解Java中的堆内存 堆是JVM运行数据区中的一块内存空间,它是线程共享的一块区域(注意了!!!),主要用来保存数组和对象实例等(其实对象有时候是不在堆中进行分配的,想要了…...
C++类和对象下详细指南
C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量,特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表,成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...
【瑞昱RTL8763E】音频
1 音乐播放控制 1.1 播放列表更新 文件系统在sd卡中保存header.bin及name.bin两份文件用于歌曲名称的存储。为方便应用层进行歌曲显示及列表管理,可将这两个bin文件信息读取并保存到nor flash中。需要播放指定名称的歌曲时,将对于歌曲名称传递给文件系…...
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
一、简介 电源管理芯片(Power Management Integrated Circuits,简称PMIC)是一种集成电路,它的主要功能是在电子设备系统中对电能进行管理和控制,包括但不限于以下几点: 电压转换:将电源电压转换…...
C++ 线性表、内存操作、 迭代器,数据与算法分离。
线性表: 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的 一种,一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系,即除了第一个和…...
PHP如何解析配置文件
在PHP中解析配置文件有多种方法,具体取决于配置文件的格式。常见的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP数组文件(即PHP文件本身包含配置数组)。下面是一些常用的方法来解析这些配置文件。 1. 解析INI文件 INI文件是最常见的…...
深入解析 iOS 上 fixed 底栏与滚动容器的手势冲突:从 H5 修复到原生根治
在移动端 H5 开发中,我们时常遇到这样的场景:页面底部有一个固定定位(position: fixed)的按钮栏或底栏,上方是一个可滚动的长列表。在 iOS 设备上,当用户尝试从底部 fixed 区域起手向上滑动时,列表却纹丝不动,仿佛被“粘”住了。这个现象不是偶发 bug,而是 iOS 对 fix…...
基于Vue的川汇水产养殖管理系统[vue]-计算机毕业设计源码+LW文档
摘要:随着水产养殖业的快速发展,传统的管理方式已难以满足现代化水产养殖的需求。本文介绍了一款基于Vue框架开发的川汇水产养殖管理系统,该系统旨在提高水产养殖管理的效率和精准度。系统涵盖了系统用户管理、水质管理、药品管理、设备管理、…...
2026算力大劫:全球开发者都在问:廉价算力到底去哪了?哪里的token性价比最高?
▶︎点击这里查看最新套餐https://coding.dongyao.ren/ 1. 2026:被“刺客”化的算力账单 进入2026年,AIGC行业并没有迎来预想中的“算力普惠”。相反,随着GPT-5.5等万亿参数模型成为企业刚需,以及北美云巨头在2026年第一季度集体…...
MCP Server避坑指南:用Java写一个能连数据库、读文件的AI工具集
MCP Server避坑指南:用Java构建企业级AI工具链 在数字化转型浪潮中,企业积累的海量数据正成为AI应用的"金矿"。但如何让大语言模型安全访问这些分布在数据库、文件系统的"数据孤岛"?MCP协议为这个问题提供了优雅的解决方…...
前端开发者的Rust入门实战:手把手教你用Tauri为现有Vite项目添加桌面端能力
前端开发者的Rust入门实战:手把手教你用Tauri为现有Vite项目添加桌面端能力 当你的Vite项目需要突破浏览器沙箱限制时,Tauri提供了最优雅的解决方案。作为Electron的现代替代品,它允许前端开发者用熟悉的Web技术栈开发桌面应用,同…...
NaViL-9B图文理解教程:从上传图片到获取结构化描述的完整步骤
NaViL-9B图文理解教程:从上传图片到获取结构化描述的完整步骤 1. 认识NaViL-9B多模态模型 NaViL-9B是一款原生支持多模态交互的大语言模型,能够同时处理文本和图像信息。与传统的纯文本模型不同,它可以直接"看懂"图片内容&#x…...
手把手教你用JavaScript实现国密SM4加密(附Node.js与微信小程序兼容代码)
从零构建JavaScript国密SM4加密引擎:跨平台实战指南 国密SM4算法作为我国商用密码体系的核心标准,正在金融、政务等领域加速替代国际加密算法。但对于JavaScript开发者而言,直接可用的SM4实现往往面临三大痛点:Node.js与微信小程序…...
告别重复编码:用快马AI一键生成团队协作网盘高效开发框架
最近在开发一个团队协作网盘系统时,发现很多基础功能其实都是重复性工作。比如权限管理、文件版本控制这些模块,每个项目都要从头写一遍。后来尝试用InsCode(快马)平台的AI生成功能,效率提升特别明显。这里分享下我的实践心得: 权…...
别只刷题了!用Python/C++搞定考研机试高频算法(附PIPIOJ真题代码重构与优化)
从暴力解法到优雅实现:Python/C双语言拆解考研机试高频算法 考研机试不仅考察算法理解,更检验工程化编码能力。许多考生能写出正确但冗长的代码,却在时间优化和代码简洁性上失分。本文将用Python和C对比实现六大高频题型,重点分析…...
突破工厂建设瓶颈:FactoryBluePrints蓝图库带来的自动化生产革命
突破工厂建设瓶颈:FactoryBluePrints蓝图库带来的自动化生产革命 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划的开源工厂蓝图…...
