每日算法刷题Day51:7.21:leetcode 栈6道题,用时1h40min

二.进阶

1.套路
2.题目描述

1.给你一个字符串 s 。它可能包含任意数量的 '*' 字符。你的任务是删除所有的 '*' 字符。
当字符串还存在至少一个 '*' 字符时,你可以执行以下操作:

  • 删除最左边的 '*' 字符,同时删除该星号字符左边一个字典序 最小的字符。如果有多个字典序最小的字符,你可以删除它们中的任意一个。
    请你返回删除所有 '*' 字符以后,剩余字符连接而成的 字典序最小 的字符串(答案)
3.学习经验
1. 3170. 删除星号以后字典序最小的字符串(中等,学习)
思想

1.给你一个字符串 s 。它可能包含任意数量的 '*' 字符。你的任务是删除所有的 '*' 字符。
当字符串还存在至少一个 '*' 字符时,你可以执行以下操作:

  • 删除最左边的 '*' 字符,同时删除该星号字符左边一个字典序 最小 的字符。如果有多个字典序最小的字符,你可以删除它们中的任意一个。
    请你返回删除所有 '*' 字符以后,剩余字符连接而成的 字典序最小 的字符串。
    2.此题和[[六.栈#7. 3412. 计算字符串的镜像分数(中等)]]一样,小写字母就可以开二十六个栈,分别记录每种字母的下标,此题难点在于同时删除该星号字符左边一个字典序 最小 的字符,即找到第一个下标栈不为空的字母,这就是要删除的位置,弹出栈顶删除完得到最终的栈后,先把保留下标合并到数组中,然后排序,最终赋值给结果
    3.可以优化为把待删除的位置变成*号,然后直接调用字符串的removeerase函数删除*即可,更快捷
代码

合并获取保留下标,然后排序,最后赋值给结果

class Solution {
public:string clearStars(string s) {int n = s.size();vector<vector<int>> stk(26);for (int i = 0; i < n; ++i) {int j = s[i] - 'a';if (s[i] != '*')stk[j].push_back(i);else {for (auto& st : stk) {if (!st.empty()) {st.pop_back();break;}}}}// 保留的下标vector<int> idx;// 先合并for (auto& st : stk)idx.insert(idx.end(), st.begin(), st.end());// 再排序sort(idx.begin(), idx.end());int m = idx.size();string res(m, '\0');for (int i = 0; i < m; ++i) {res[i] = s[idx[i]];}return res;}
};

把待删除的位置变成*号,然后直接调用字符串的removeerase函数删除*号:

class Solution {
public:string clearStars(string s) {int n = s.size();vector<vector<int>> stk(26);for (int i = 0; i < n; ++i) {int j = s[i] - 'a';if (s[i] != '*')stk[j].push_back(i);else {for (auto& st : stk) {if (!st.empty()) {s[st.back()] = '*'; // 变成'*'号st.pop_back();break;}}}}// remove+earse方法删除所有'*'号s.erase(remove(s.begin(), s.end(), '*'), s.end());return s;}
};

三.邻项消除

1.套路
2.题目描述
3.学习经验

1.遇到某个连续子串要删除,即遇到最后一项,判断栈顶以下几个元素是否匹配该子串,匹配则不断弹出栈,否则最后一项入栈
2.遇到只能用一种连续字符串构造与还原问题[[六.栈#5. 1003. 检查替换后的词是否有效(中等)]]

1. 2696. 删除子串后的字符串最小长度(简单)

2696. 删除子串后的字符串最小长度 - 力扣(LeetCode)

思想

1.给你一个仅由 大写 英文字符组成的字符串 s
你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB""CD" 子字符串。
通过执行操作,删除所有 "AB""CD" 子串,返回可获得的最终字符串的 最小 可能长度。
注意,删除子串后,重新连接出的字符串可能会产生新的 "AB""CD" 子串。
2.此题就是遇到B,栈顶为A则出栈A,否则入B,遇到D,栈顶为C则出栈C,否则入D,其他字符均入栈

代码
class Solution {
public:int minLength(string s) {int n = s.size();vector<char> stk;for (auto& ch : s) {if (ch == 'B') {if (!stk.empty() && stk.back() == 'A')stk.pop_back();elsestk.push_back(ch);} else if (ch == 'D') {if (!stk.empty() && stk.back() == 'C')stk.pop_back();elsestk.push_back(ch);} elsestk.push_back(ch);}return (int)stk.size();}
};
2. 1047. 删除字符串中的所有相邻重复项(简单)

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

思想

1.给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
s 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
2.待入栈的每个字符,栈不为空且栈顶等于该字符则栈顶出栈,否则该字符入栈

代码
class Solution {
public:string removeDuplicates(string s) {int n = s.size();string stk;for (auto& ch : s) {if (!stk.empty() && stk.back() == ch)stk.pop_back();elsestk.push_back(ch);}return stk;}
};
3. 1544. 整理字符串(简单)

1544. 整理字符串 - 力扣(LeetCode)

思想

1.给你一个由大小写英文字母组成的字符串 s
一个整理好的字符串中,两个相邻字符 s[i]s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件:

  • s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。
  • s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。
    请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。
    请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样例对应的答案是唯一的。
    **注意:空字符串也属于整理好的字符串,尽管其中没有任何字符。
代码
class Solution {
public:string makeGood(string s) {int n = s.size();string stk;for (auto& ch : s) {if (!stk.empty() &&((ch >= 'A' && ch <= 'Z' && ch - 'A' + 'a' == stk.back()) ||(ch >= 'a' && ch <= 'z' && ch - 'a' + 'A' == stk.back())))stk.pop_back();elsestk.push_back(ch);}return stk;}
};
4. 3561. 移除相邻字符(中等)

3561. 移除相邻字符 - 力扣(LeetCode)

思想

1.给你一个由小写英文字母组成的字符串 s
必须 在字符串 s 中至少存在两个 连续 字符时,反复执行以下操作:

  • 移除字符串中 最左边 的一对按照字母表 连续 的相邻字符(无论是按顺序还是逆序,例如 'a''b',或 'b''a')。
  • 将剩余字符向左移动以填补空隙。
    当无法再执行任何操作时,返回最终的字符串。
    **注意:字母表是循环的,因此 'a''z' 也视为连续。
代码
class Solution {
public:string resultingString(string s) {int n = s.size();string stk;for (auto& ch : s) {int i = ch - 'a';if (!stk.empty() && ((i + 1) % 26 == (stk.back() - 'a') ||(i - 1 + 26) % 26 == (stk.back() - 'a')))stk.pop_back();elsestk.push_back(ch);}return stk;}
};

优化按照字母表 连续 的相邻字符(无论是按顺序还是逆序)的判断方法:

abs(ch-stk.back())==1 || abs(ch-stk.back())==25
5. 1003. 检查替换后的词是否有效(中等)

1003. 检查替换后的词是否有效 - 力扣(LeetCode)

思想

1.给你一个字符串 s ,请你判断它是否 有效
字符串 s 有效 需要满足:假设开始有一个空字符串 t = "" ,你可以执行 任意次 下述操作将 t 转换为 s

  • 将字符串 "abc" 插入到 t 中的任意位置。形式上,t 变为 tleft + "abc" + tright,其中 t == tleft + tright 。注意,tlefttright 可能为
    如果字符串 s 有效,则返回 true;否则,返回 false
    2.此题特征为只运行插入合法子串"abc",从而构造出s,现在让我们去通过s反过来还原为t,即模式识别到这个合法子串就弹出
代码
class Solution {
public:bool isValid(string s) {int n = s.size();string stk;for (auto& ch : s) {if (stk.size() >= 2 && ch == 'c' && stk.back() == 'b' &&stk[stk.size() - 2] == 'a') {stk.pop_back();stk.pop_back();} elsestk.push_back(ch);}return stk.empty();}
};

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

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

相关文章

网络基础DAY16-MSTP-VRRP

STP/RSTP的局限性1.所有VLAN共享一棵生成树 2.无法实现不同VLAN在多条Trunk链路上的负载分担 3.次优化二层路径。MSTP的基本概念及优势MSTP的定义MST域拥有相同MST配置标识的网桥构成的集合。 具体如何分辨是否是同一个域&#xff0c;就看域名&#xff0c;配置修订号&#xff0…

freertos关键函数理解 uxListRemove

//删除pxItemToRemove节点 UBaseType_t uxListRemove(ListItem_t *pxItemToRemove) { //The list item knows which list it is in. Obtain the list from the list item.//找到节点所在的链表//my_printf( "uxListRemove pxItemToRemove %#p\n", pxI…

C语言---番外篇(柔性数组)

前言&#xff1a; 由于这块内容所谓综合性比较高&#xff0c;有数组的知识&#xff0c;有结构体的知识&#xff0c;还有动态内存管理的知识&#xff0c;所以我就单独写一篇博客&#xff0c;此谓番外篇。 柔性数组的概念 定义在结构体的最后一个元素的位置且大小未知的数组就叫…

单片机的几种GPIO输入输出模型详解

模式选择汇总参考表&#xff1a;模式输出驱动输入阻抗默认状态典型应用场景推挽输出强驱动禁用可配置LED, SPI, 高速信号开漏输出弱驱动禁用低/悬空IC, 电平转换, 线与浮空输入禁用极高不确定外部强驱动信号上拉输入禁用中高高电平按键(接地型), 数字输入下拉输入禁用中高低电平…

深度解析ECharts.js:构建现代化数据可视化的利器

引言&#xff1a;数据可视化的新时代挑战 在数字化转型浪潮中&#xff0c;数据可视化已成为企业决策和用户体验的关键环节。面对海量数据的呈现需求&#xff0c;传统表格已无法满足用户对直观洞察的渴求。作为百度开源的JavaScript可视化库&#xff0c;ECharts.js凭借其强大的功…

从零构建实时通信引擎:Freeswitch源码编译与深度优化指南

一、构建工具&#xff1a;编译FreeSWITCH及其依赖库的基础 1. CMake2. Autoconf 二、汇编器&#xff1a;提升音视频处理性能 3. YASM / NASM 三、音视频编解码器&#xff1a;支撑实时媒体传输 4. Opus5. x264 (可选)6. libvpx / libvpx2 (可选) 四、多媒体框架与工具库&#xf…

网络原理 HTTP 和 HTTPS

目录 一 . HTTP 协议 二 . 抓包 三 . HTTP 请求 / 响应的基本格式 &#xff08;1&#xff09;HTTP请求的基本格式 &#xff08;2&#xff09;HTTP响应的基本格式 四 . HTTP 方法 GET 和 POST 的区别&#xff1a; 五 . 请求报头和响应报头 &#xff08;1&#…

基于单片机的自动条幅悬挂机

摘 要 随着日新月异科技发展&#xff0c;在心率体温测量方面&#xff0c;我们取得了迅速的发展&#xff0c;就近日而言&#xff0c;脉搏测量仪已经在多个领域大展身手&#xff0c;除了在医学领域有所建树&#xff0c;在人们的日常生活方面的应用也不断拓展&#xff0c;如检疫…

《C++》面向对象编程--类(中)

文章目录一、构造函数1.1定义1.2语法1.3特性二、析构函数2.1定义2.2语法2.3特性三、拷贝构造函数3.1定义3.2语法3.3特性3.4浅拷贝3.4.1定义3.4.2浅拷贝的风险3.5深拷贝一、构造函数 1.1定义 在C中&#xff0c;构造函数&#xff08;Constructor&#xff09; 是一种特殊的成员函…

机器学习初学者理论初解

大家好! 为什么手机相册能自动识别人脸&#xff1f;为什么购物网站总能推荐你喜欢的商品&#xff1f;这些“智能”背后&#xff0c;都藏着一位隐形高手——机器学习&#xff08;Machine Learning&#xff09;。一、什么是机器学习&#xff1f;简单说&#xff0c;机器学习是教计…

原码反码补码

在Java中&#xff0c;无论是小数还是整数&#xff0c;他们都要带有符号&#xff08;和C语言不同&#xff0c;C语言有无符号数&#xff09;。首位就作为符号位。原码反码&#xff1a;正数的反码是其原码本身负数的反码是在其原码的基础上, 符号位不变&#xff0c;其余各个位取反…

使用ubuntu:20.04和ubuntu:jammy构建secretflow环境

一、使用ubuntu:20.04构建隐语编译环境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(铰链损失函数)详解:SVM 中的关键损失函数

&#x1f4cc; 一、什么是 Hinge Loss&#xff1f;Hinge Loss&#xff08;铰链损失&#xff09;&#xff0c;是 支持向量机&#xff08;SVM, Support Vector Machine&#xff09; 中常用的一种损失函数&#xff0c;用于最大间隔分类。其核心思想是&#xff1a;当预测结果已经正…

days32 :零基础学嵌入式之网络2.0

一、wireshark &#xff1a;网络抓包工具1.功能&#xff1a;抓取通过电脑网卡的网络数据2.作用&#xff1a;排查故障、抓取数据做数据分析、3.用法&#xff1a;&#xff08;1&#xff09;sudo wireshark&#xff08;2&#xff09;选择需要抓取的网卡》any&#xff08;3&#xf…

数字护网:一次深刻的企业安全体系灵魂演练

&#x1f9e9; 引言&#xff1a;什么是“护网”&#xff1f;—— 不止是攻防&#xff0c;更是企业安全能力的年度大考 每年&#xff0c;由国家相关部门牵头的“护网行动”都如期而至&#xff0c;各大企事业单位的安全团队也随之进入高度戒备状态。然而&#xff0c;“护网”远非…

基于 NumPy 的高效数值计算技术解析与实践指引

在数据处理与科学计算领域&#xff0c;高效是核心诉求。NumPy 作为 Python 生态高效数值计算的基石&#xff0c;以高性能多维数组对象及配套函数&#xff0c;成为数据从业者的必备工具。其数组支持算术、比较、逻辑等丰富运算&#xff0c;通过向量化操作直接处理每个元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的选举 在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller)​,它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— ImageCarousel组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 语法以及 Tailwind CSS …

基于springboot的智能物流管理系统(源码+论文)

一、开发环境 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器&#xff0c;基于SQL的客户/服务器模式的关系数据库管理系统。其特点包括&#xff1a; 功能强大&#xff1a;支持多用户、多线程操作。使用简单&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章

目录 Collection简介 Collection的遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 List集合的遍历方式 列表迭代器遍历以及普通for循环 数据结构 栈 队列 数组 链表 单向链表 双向链表 二叉树 遍历方式 普通二叉树 二叉查找树 平衡二叉树 旋转…