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

每日算法刷题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.dtcms.com/a/291293.html

相关文章:

  • 【项目实战】——深度学习.全连接神经网络
  • PostgreSQL SysCache RelCache
  • Java API (二):从 Object 类到正则表达式的核心详解
  • DevOps是什么?
  • Flutter中 Provider 的基础用法超详细讲解(一)
  • C++的“链”珠妙笔:list的编程艺术
  • JAVA序列化知识小结
  • mac终端设置代理
  • 拟合算法(1)
  • socket编程(UDP)
  • QGIS、ArcMap、ArcGIS Pro中的书签功能、场景裁剪
  • 本地部署Dify、Docker重装
  • 时序论文43 | WPMixer:融合小波分解的多分辨率长序列预测模型
  • Nginx配置proxy protocol代理获取真实ip
  • ubuntu远程桌面不好使
  • 修复echarts由4.x升级5.x出现地图报错echarts/map/js/china.js未找到
  • 卷积神经网络基本概念
  • 深度学习之参数初始化和损失函数(四)
  • 深入解析MIPI C-PHY (二)C-PHY三线魔术:如何用6种“符号舞步”榨干每一滴带宽?
  • 设计模式六:工厂模式(Factory Pattern)
  • C语言:20250721笔记
  • 在 Conda 中删除环境及所有安装的库
  • 《使用 IDEA 部署 Docker 应用指南》
  • Linux-rpm和yum
  • Shell脚本编程:从入门到精通的实战指南
  • 从零开始:用Python库轻松搭建智能AI代理
  • Djoser 详解
  • 深度学习中的数据增强:从理论到实践
  • hot100回归复习(算法总结1-38)
  • 力扣面试150(35/150)