力扣第2390题 从字符串中移除星号 c++ stack容器?超内存 用双指针 巧解

题目

力扣第2390. 从字符串中移除星号

中等

给你一个包含若干星号 * 的字符串 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 <= 105
  • s 由小写英文字母和星号 * 组成
  • s 可以执行上述操作

思路和解题方法一(不行超内存)

  • 首先创建一个栈st,用于存储非星号字符。
  • 然后遍历字符串s中的每个字符:
    • 如果当前字符是星号('*')并且栈st不为空,则将栈顶的元素弹出,表示移除星号左侧最近的非星号字符。
    • 如果当前字符不是星号,则将其入栈st。
  • 创建一个空字符串result,用于存储最终结果。
  • 最后,从栈底到栈顶依次弹出字符,将每个字符拼接到result的前面。
  • 返回result作为最终的结果字符串。

这段代码使用了栈的特性,通过判断当前字符是否是星号以及栈是否为空,来实现移除星号左侧最近的非星号字符的操作。最后,将栈中剩余的字符拼接成结果字符串返回。

复杂度

        时间复杂度:

                O(n)

        其中n是字符串的长度。在遍历过程中,每个字符最多入栈和出栈一次,因此栈的操作总体上可以看作是线性时间复杂度的。所以总的时间复杂度为O(n)。

        空间复杂度

                O(n)

        算法使用了一个栈来存储非星号字符,栈的大小最坏情况下可能与输入字符串的长度相同。

c++ 代码

 
class Solution {
public:std::string removeStars(string s) {stack<char> st; // 创建一个栈,用于存储非星号字符for (char c : s) { // 遍历字符串s中的每个字符if (c == '*' && !st.empty()) { // 如果当前字符是星号且栈不为空,则将栈顶元素弹出,表示移除星号左侧最近的非星号字符st.pop();} else if (c != '*') { // 如果当前字符不是星号,则将其入栈st.push(c);}}string result; // 创建一个空字符串,用于存储最终结果while (!st.empty()) { // 从栈底到栈顶依次弹出字符,将每个字符拼接到result的前面result = st.top() + result;st.pop();}return result; // 返回最终结果字符串}
};

 思路和解题方法二

首先,我们定义了两个指针i和j。i是慢指针,指向当前要处理的字符,j是快指针,用于遍历字符串。同时,我们也记录了字符串的长度n:

int n = s.length(); int i = 0; 
// 慢指针,指向当前要处理的字符 int j = 0; // 快指针,用于遍历字符串

接下来,我们开始遍历字符串。对于每一个字符,如果它是星号,我们需要移除星号左侧最近的非星号字符。我们可以通过将慢指针i往前移动来找到最近的非星号字符,直到遇到一个非星号字符或者到达字符串开头。注意,我们需要判断i是否大于0,以避免数组越界错误。然后,我们将慢指针i再往前移动一位,即移除了最近的非星号字符:

if (s[j] == '*') {// 找到星号时,移除星号左侧最近的非星号字符while (i > 0 && s[i-1] == '*') {i--;}if (i > 0) {i--; // 移除非星号字符}
}

如果当前字符不是星号,我们将其放到当前慢指针i的位置,并同时移动慢指针i和快指针j:

else {// 非星号字符,将其放到当前慢指针的位置s[i] = s[j];i++;
}
j++;

最后,我们返回从字符串开头到慢指针i的子串,即移除了所有星号之后的字符串。注意,这里需要使用substr函数获取子串,其第一个参数是子串的起始位置,第二个参数是子串的长度:

return s.substr(0, i);

复杂度

        时间复杂度:

                O(n)

        时间复杂度是O(n),其中n是输入字符串的长度。因为我们需要遍历整个字符串一次来处理每个字符。

        空间复杂度

                O(1)

        空间复杂度是O(1),因为我们只使用了常数个变量来保存指针和临时变量,没有使用额外的数据结构。

c++ 双指针 代码

 
class Solution {
public:std::string removeStars(string s) {stack<char> st; // 创建一个栈,用于存储非星号字符for (char c : s) { // 遍历字符串s中的每个字符if (c == '*' && !st.empty()) { // 如果当前字符是星号且栈不为空,则将栈顶元素弹出,表示移除星号左侧最近的非星号字符st.pop();} else if (c != '*') { // 如果当前字符不是星号,则将其入栈st.push(c);}}string result; // 创建一个空字符串,用于存储最终结果while (!st.empty()) { // 从栈底到栈顶依次弹出字符,将每个字符拼接到result的前面result = st.top() + result;st.pop();}return result; // 返回最终结果字符串}
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

babel.config.js配置文件详解

文章目录 一、前言三、babel 详解四、拓展阅读 一、前言 项目开发阶段&#xff0c;使用可选链操作符 ?. 出现以下编译报错问题&#xff1a; 分析&#xff1a;由于可选链操作符 ?. 是ES2020&#xff08;即ES11&#xff09;中推出的新语法&#xff0c;允许我们不需要校验当前属…

FreeRTOS(以STM32F1系列为例子)

目录 任务管理任务函数任务控制块顶层任务状态创建任务xTaskCreatexTaskCreateStaticxTaskCreateRestricted 任务优先级和心跳设置心跳设置优先级概述vTaskPrioritySetuxTaskPriorityGet 非运行态扩充阻塞态vTaskDelay挂起状态vTaskSuspend就绪状态完整的状态转换图延迟函数vTa…

Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的

前言 为什么Spring Boot条件注解那么多&#xff0c;而标题中是ConditionalOnBean呢&#xff1f; 因为&#xff0c;相比之下我们用的比较多的条件装配注解也就是ConditionalOnClass、ConditionalOnBean了&#xff0c;而ConditionalOnClass对顺序并不敏感&#xff08;说白了就是判…

stream对list数据进行多字段去重

方法一&#xff1a; //根据sj和name去重 List<NursingHandover> testList list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getj() ";" o.getName() ";&…

《数据结构、算法与应用C++语言描述》-栈的应用-开关盒布线问题

开关盒布线问题 问题描述 在开关盒布线问题中&#xff0c;给定一个矩形布线区域&#xff0c;其外围有若干管脚。两个管脚之间通过布设一条金属线路来连接。这条金属线路称为电线&#xff0c;它被限制在矩形区域内。两条电线交叉会发生电流短路。因此&#xff0c;电线不许交叉…

根据GWAS数据估算样本量N和使用千人基因组填充maf的参考文献

https://github.com/GenomicSEM/GenomicSEM/wiki/2.1-Calculating-Sum-of-Effective-Sample-Size-and-Preparing-GWAS-Summary-Statistics

SpringBoot全局异常处理请求参数校验及响应体包装

一、响应体包装 全局接口响应体包装&#xff0c;返回json数据支持对部分接口或者类放行 # mvc配置mvc:body-exclude-paths:- /test/**body-exclude-classes:- com.qiangesoft.rdp.starter.XXXimport lombok.Data; import org.springframework.boot.context.properties.Configu…

AI绘画本地部署Stable Diffusion web UI

AI绘画本地部署Stable Diffusion web UI 一 、项目介绍 A browser interface based on Gradio library for Stable Diffusion. 项目地址&#xff1a;GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 这是一个可以通过直接输入描述性文字文本来生成…

Verilog参数定义与仿真模块中的参数修改

文章目录 参数方式定义参数的优势rtl模块中的参数定义模块名后定义参数parameter定义参数 仿真模块中的参数修改例化时修改defparam修改 总结与说明附录&#xff1a;测试代码 参数方式定义参数的优势 当一个模块被另一个模块引用例化时&#xff0c;高层模块可以对低层模块的参…

MD5 绕过第三式:ffifdyop

文章目录 参考环境推荐阅读雾现两个 PHP 文件表结构分析 雾散ASCII 编码二进制数据到 ASCII 文本的转化绕过原理ffifdyop绕过 ffifdyop 的批量化生产批量化生产注意事项细节一字之差运算符优先级 实际需要遵守的规则 生产机器 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心…

幂级数和幂级数的和函数有什么关系?

幂级数和幂级数的和函数有什么关系&#xff1f; 本文例子引用自&#xff1a;80_1幂级数运算&#xff0c;逐项积分、求导【小元老师】高等数学&#xff0c;考研数学 求幂级数 ∑ n 1 ∞ 1 n x n \sum\limits_{n1}^{\infty}\frac{1}{n}x^n n1∑∞​n1​xn 的和函数 &#xff…

分析各种表达式求值过程

目录 算术运算与赋值 编译器常用的两种优化方案 常量传播 常量折叠 加法 Debug编译选项组下编译后的汇编代码分析 Release开启02执行效率优先 减法 Release版下优化和加法一致&#xff0c;不再赘述 乘法 除法 算术结果溢出 自增和自减 关系运算与逻辑运算 JCC指…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建

ESP-Mesh-Lite的开发环境由于没有官方教程&#xff0c;折腾了好几天。环境搭建主要还是参考ESP-MDF环境搭建&#xff0c;特别注意的是必须要在CMD环境下操作&#xff0c;不能用POWER SHELL。 ESP-Mesh-Lite目前支持到5.1的SDK&#xff0c;当然4.4也是可以用的。首先上Gitee或G…

Android 查看路由表

Android 查看路由表_android 路由表_念雅的博客-CSDN博客

百度统计配置详细图文教程包含siteId、百度统计AccessToken、百度统计代码获取步骤教程

一、前言 很多网友开发者都不知道百度统计siteId、百度统计token怎么获取&#xff0c;在网上找的教程都是几年前老的教程&#xff0c;因此给大家出一期详细百度统计siteId、百度统计token、百度统计代码获取详细步骤教程。 二、登录到百度统计 1.1 登录到百度统计官网 使用个…

不同部署环境下事务特性

RDBMS: 集中环境&#xff1a;ACID&#xff0c;强事务要求。采用JDBC事务 Atomicity(原子性),一个事务中所有操作都必须全部完成&#xff0c;要么全部不完成。 Consistency(一致性),在事务开始或结束时&#xff0c;数据库应该在一致状态。 Isolation(隔离性),事务将假定只有…

SPSS探索性分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件可在个人主页—…

StarRocks数据导入

1、相关环境 Flink作为当前流行的流式计算框架&#xff0c;在对接StarRocks时&#xff0c;若直接使用JDBC的方式"流式"写入数据&#xff0c;对StarRocks是不友好的&#xff0c;StarRocks作为一款MVCC的数据库&#xff0c;其导入的核心思想还是"攒微批降频率&qu…

Java Package用法:组织与管理类的利器

在Java开发中&#xff0c;package&#xff08;包&#xff09;是一种用于组织和管理类的机制。它提供了一种将相关类组织在一起的方式&#xff0c;使得类的命名更加清晰和易于管理。通过定义package&#xff0c;可以将类的命名空间进行划分&#xff0c;避免命名冲突&#xff0c;…

thinkphp csv格式导入导出

封装成函数&#xff1a; class Csv{/*** 导出csv文件*/public function export_csv($list, $title){$file_name "export" . time() . ".csv"; // 文件名header(Content-Type: application/vnd.ms-excel); // 设置内容类型为Excelheader(Content-Disposit…