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

LeetCode:2390. 从字符串移除*号 使用栈,时间复杂度O(N)

2390. 从字符串移除*号

today 2390. 从字符中移除*号

题目表述

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

在一步操作中,你可以:

选中 s 中的一个星号。
移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
返回移除 所有 星号之后的字符串。

注意:

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

示例1:

输入: s = “leet**cod*e”
输出: “lecoe”
解释: 从左到右执行移除操作:

  • 距离第 1 个星号最近的字符是 “leet**code" 中的 ‘t’ ,s 变为 "leecod*e” 。
  • 距离第 2 个星号最近的字符是 “leecode” 中的 ‘e’ ,s 变为 “lecod*e” 。
  • 距离第 3 个星号最近的字符是 “lecod*e” 中的 ‘d’ ,s 变为 “lecoe” 。
    不存在其他星号,返回 “lecoe” 。

示例2:

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

提示:

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

题目解析

题目要求我们从字符串 s 中移除所有星号,并返回移除星号之后的字符串。

我们可以使用栈来解决这个问题。通过维护一个栈来存储最终结果res,初始时栈为空。我们从前到后遍历字符串 s:

  • 如果遇到星号,我们将栈中的栈顶元素弹出。
  • 如果遇到非星号,我们将其压入栈中。
  • 遍历完成后,栈中的元素即为最终结果。

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),遍历字符串 s 一次。
  • 空间复杂度: O ( n ) O(n) O(n),栈最多存储 n 个元素。

代码实现

Python实现:

class Solution(object):
    def removeStars(self, s):
        stack = []
        for char in s:
            if char == '*':
                stack.pop()  # 移除栈顶元素,即上一个添加的字符
            else:
                stack.append(char)  # 将非 '*' 字符压入栈中
        return ''.join(stack)  # 最后将栈中的字符连接成字符串返回

C++实现:

class Solution {
public:
    string removeStars(string s) {
        string res;
        for (char c : s) {
            if (c == '*') {
                res.pop_back();  // 遇到 '*' 时移除最后一个字符
            } else {
                res.push_back(c);  // 添加非 '*' 的字符
            }
        }
        return res;
    }
};

Go实现:

func removeStars(s string) string {
    // 预先分配切片容量,避免多次动态扩容
    res := make([]byte, 0, len(s)) 
    for i := 0; i < len(s); i++ {
        if s[i] == '*' {
            res = res[:len(res)-1]  // 从切片中移除最后一个元素
        } else {
            res = append(res, s[i])  // 非 '*' 字符加入切片
        }
    }
    return string(res)  // 将最终的 byte 切片转化为字符串
}

http://www.kler.cn/news/304662.html

相关文章:

  • 计算机视觉中,Pooling的作用
  • 系统架构师考试学习笔记第五篇——架构设计补充知识(26)论文写作
  • 炫酷HTML蜘蛛侠登录页面
  • CentOS 7官方源停服,配置本机光盘yum源
  • 无人机视角的道路损害数据集,2400张图像,包括纵向裂缝(LC)、横向裂缝(TC)、鳄鱼裂缝(AC)、斜裂(OC)、修补(RP)和坑洞(PH),共2.3GB
  • OpenCV-Python笔记(上)
  • Kubernetes 持续集成与交付(CI/CD)
  • 学习平台|基于java的移动学习平台系统小程序(源码+数据库+文档)
  • UE5 阴影通道
  • 计算机毕业设计 大学志愿填报系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 基于 SpringBoot 的私人健身与教练预约管理系统
  • Git常用命令与基本操作(包括搭建git环境)
  • ResNet(Residual Network)网络介绍
  • [linux 驱动]misc设备驱动详解与实战
  • 【Python小知识 - 2】:在VSCode中切换Python解释器版本
  • 王者荣耀改重复名(java源码)
  • 服务器数据增量迁移方案-—SAAS本地化及未来之窗行业应用跨平台架构
  • Java项目: 基于SpringBoot+mybatis+maven新闻推荐系统(含源码+数据库+毕业论文)
  • 【vue-media-upload】一个好用的上传图片的组件,注意事项
  • 道路检测-目标检测数据集(包括VOC格式、YOLO格式)
  • Jenkins、Ansible 和 Git 的自动化部署教程
  • 使用C++实现一个支持基本消息传递的TCP客户端和服务器
  • 精准学:用一根垂直大模型支柱,撑起教育普惠的未来
  • 私域流量的价值探索:开源链动 2+1 模式、AI 智能名片与 S2B2C 商城小程序的助力
  • Apache POI 学习
  • Linux的luks设备上的分区名字的一个现象
  • Docker镜像下载-使用github action- 解决无法下载docker镜像的问题
  • Apache Spark Streaming技术深度解析
  • IP core 在硬件上实现的流程
  • Linux环境使用Git同步教程