Leetcode3039. 进行操作使字符串为空

Every day a Leetcode

题目来源:3039. 进行操作使字符串为空

解法1:哈希 + 排序

操作的定义:每次操作依次遍历 ‘a’ 到 ‘z’,如果当前字符出现在 s 中,那么删除出现位置最早的该字符(如果存在的话)。

最后一次操作之前的字符串 s 是出现次数最多的字符(可能不止一个)按最后出现位置下标从小到大排列的结果。

我们用一个哈希表 cnt 记录各字符的出现次数,一个数组 lastIndex 记录每个字符最后一次出现的位置下标。

设 max_cnt = *max_element(cnt.begin(), cnt.end()),用一个数组 idx 记录 cnt 中元素值等于 max_cnt 的对应位置下标,则 idx 里存储的就是答案字符串的字符在原字符串的最后一次出现的位置下标。

答案 ans 的长度就是数组 idx 的元素个数。

对 idx 进行增序排序,遍历数组 idx,则 ans[i] 即为 s[idx[i]]。

最后返回 ans。

代码:

/*
 * @lc app=leetcode.cn id=3039 lang=cpp
 *
 * [3039] 进行操作使字符串为空
 */

// @lc code=start

// 哈希 + 排序

class Solution
{
public:
    string lastNonEmptyString(string s)
    {
        if (s.empty())
            return "";

        vector<int> cnt(26, 0);        // 字符的出现次数
        vector<int> lastIndex(26, -1); // 字符的最后下标

        for (int i = 0; i < s.length(); i++)
        {
            char c = s[i];
            cnt[c - 'a']++;
            lastIndex[c - 'a'] = i;
        }

        int max_cnt = *max_element(cnt.begin(), cnt.end());
        vector<int> idx;

        for (int i = 0; i < 26; i++)
        {
            if (cnt[i] == max_cnt)
                idx.push_back(lastIndex[i]);
        }
        sort(idx.begin(), idx.end());

        string ans(idx.size(), 0);
        for (int i = 0; i < idx.size(); i++)
            ans[i] = s[idx[i]];

        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n+∣Σ∣log∣Σ∣),其中 其中 n 为字符串s 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26。

空间复杂度:O(∣Σ∣),其中 ∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从ViT到MAE,transformer架构改造Autoencoder

Vision Transformer (ViT) 论文出处[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (arxiv.org) 传统的卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测等任务上表现出色&#xff0c;但其局限性也逐渐显露&#xf…

《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)

文章目录 3.1 编写 Dockerfile3.1.1 重点基础知识3.1.2 重点案例&#xff1a;创建简单 Python 应用的 Docker 镜像3.1.3 拓展案例 1&#xff1a;Dockerfile 优化3.1.4 拓展案例 2&#xff1a;多阶段构建 3.2 构建流程深入解析3.2.1 重点基础知识3.2.2 重点案例&#xff1a;构建…

GO-ICP的使用(一)

一、代码下载以、修改以及使用 下载&#xff1a; 链接&#xff1a;yangjiaolong/Go-ICP: Implementation of the Go-ICP algorithm for globally optimal 3D pointset registration (github.com) 解压之后 &#xff1a; 首先visual studio项目&#xff0c;配置好PCL环境&…

计算机组成原理(13)-----硬件多线程

目录 1.细粒度多线程 2.粗粒度多线程 3.同时多线程&#xff08;SMT&#xff09; 在不支持硬件多线程的处理器中&#xff0c;若要进行线程的切换&#xff0c;就需要保存和恢复线程的运行环境&#xff08;否则会出现数据覆盖引起的错误&#xff09;。 但在支持硬件多线程的处…

五篇保姆级分类诊断教程,数据特征提取+优化算法+机器学习

今天水一期&#xff0c;总结一下以前写过的几篇保姆级故障诊断。学会这几篇&#xff0c;机器学习的故障诊断你就基本合格了&#xff01; 本期内容&#xff1a;基于SABO-VMD-CNN-SVM的分类诊断。 依旧是采用经典的西储大学轴承数据。基本流程如下&#xff1a; 首先是以最小包络熵…

Github代码仓库SSH配置流程

作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04 更新日期&#xff1a; 2024/02/21 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#xff1a; 由于笔者水平有限&#xff0c;以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…

RocketMQ快速实战以及集群架构原理详解

RocketMQ快速实战以及集群架构原理详解 组成部分 启动Rocket服务之前要先启动NameServer NameServer 提供轻量级Broker路由服务&#xff0c;主要是提供服务注册 Broker 实际处理消息存储、转发等服务的核心组件 Producer 消息生产者集群&#xff0c;通常为业务系统中的一个功…

基础光学系列:(四)机器视觉中的光圈、焦距与景深调整技巧

控制景深和成像质量是摄影和机器视觉领域的关键技能。通过调整光圈、焦距、和感光元件&#xff08;如数码相机的图像传感器&#xff09;的位置&#xff0c;可以精细地控制图像的外观。下面是如何通过这些参数来控制景深和提高成像质量的一些建议&#xff1a; 调整光圈来控制景…

学生管理系统简易版(C语言)

简介&#xff1a; 有登录功能&#xff0c;这个功能是利用文本文件来保存用户名和密码彩色的菜单页面多种功能较好的排版含有文件夹图标 目录展示&#xff1a; 页面展示&#xff1a; 下载链接&#xff1a;https://download.csdn.net/download/liyankang/88873436 度盘链接&…

BUU [GWCTF 2019]mypassword

BUU [GWCTF 2019]mypassword 开题&#xff0c;是个登录界面&#xff0c;也有注册功能 首先我们注册个号看看。然后登录 提示不是SQL注入 有反馈界面&#xff0c;反馈应该管理员会看&#xff0c;可能存在XSS。 查看源码&#xff0c;注释给出了后端源码&#xff0c;对XSS进行了…

GEE数据集——GLANCE 全球土地覆被训练数据集

GLANCE 全球土地覆被训练数据集 GLanCE 培训数据集向公众开放&#xff0c;专为区域到全球土地覆被和土地覆被变化分析而设计。该数据集的中等空间分辨率为 30 米&#xff0c;时间跨度为 1984 年至 2020 年&#xff0c;在地理和光谱上代表了全球所有生态区域。每个训练单元提供多…

极狐GitLab 使用指南:如何使用极狐GitLab 进行第一次 git commit

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 进行第一次 Git 提交 本教程包含一些关于 Git 的工作原理&…

Escalate_Linux-环境变量劫持提权(5)

环境变量劫持提权 在Shll输入命令时&#xff0c;Shel会按PAH环境变量中的路径依次搜索命令&#xff0c;若是存在同名的命令&#xff0c;则执行最先找到的&#xff0c;若是PATH中加入了当前目录&#xff0c;也就是“”这个符号&#xff0c;则可能会被黑客利用&#xff0c;例如在…

RM电控讲义【HAL库篇】(二)

8080并口模式是一种常见的计算机接口模式&#xff0c;主要用于LCD&#xff08;液晶显示屏&#xff09;模块。 在8080并口模式中&#xff0c;通信端口包括多种信号线&#xff0c;用于实现数据的读写和控制功能。主要的信号线包括&#xff1a; CS&#xff08;片选信号&#xff…

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

Java——防止SQL注入的几种策略

一、什么是SQL注入 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者通过操纵应用程序的输入来执行恶意的SQL查询。这种漏洞发生在应用程序没有正确验证、过滤或转义用户提供的输入数据时。攻击者可以利用这个漏洞来执行未经授…

Flask基础学习3

参考视频&#xff1a;41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码&#xff08;登录QQ邮箱的授权码总是断开收不到邮件&#xff09;&#xff0c; # config # config mail MAI…

Python入门必学:单引号、双引号与三引号的差异与应用

Python入门必学&#xff1a;单引号、双引号与三引号的差异与应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得…

HC595级联原理及实例 - STM32

74HC595的最重要的功能就是&#xff1a;串行输入&#xff0c;并行输出。其次&#xff0c;74HC595里面有2个8位寄存器&#xff1a;移位寄存器、存储寄存器。74HC595的数据来源只有一个口&#xff0c;一次只能输入一个位&#xff0c;那么连续输入8次&#xff0c;就可以积攒为一个…

MiKTeX安装后,Latex编译后PDF无法预览,是灰色的

解决方式删掉编译器就可以&#xff0c; 即删掉MiKTeX MiKTeX安装后会将编译器默认修改为MiKTeX&#xff0c;这个时候会显示报错&#xff0c;简单粗暴的方式是删掉MiKTeX软件