当前位置:网站首页>leetcode:316. 去除重复字母
leetcode:316. 去除重复字母
2022-08-09 04:42:00 【OceanStar的学习笔记】
题目来源
题目描述
class Solution {
public:
string removeDuplicateLetters(string s) {
}
};
题目解析
思路
class Solution {
public:
string removeDuplicateLetters(string s) {
std::string stk;
// 首先,我们要记录字符串中每个字符出现的次数(在遍历中,每次容器移除字母时,需要减去相应字母的出现次数)。
std::vector<int> cnt(26);
for(auto a: s){
++cnt[a - 'a'];
}
for(auto a : s){
// 遇到一个新字符 如果比栈顶小 并且在新字符后面还有和栈顶一样的 就把栈顶的字符抛弃了
if (stk.find(a) == std::string::npos){
// b
while(!stk.empty() && cnt[stk.back()-'a'] > 0 && stk.back() > a)
{
stk.pop_back();
}
stk.push_back(a);
}
// 当前遍历的字母在容器中已经出现过,将该字母次数减1, 进行下一次遍历。
--cnt[a - 'a'];
}
return stk;
}
};
思路
题目:
- 要求一、要去重。
- 要求二、去重字符串中的字符顺序不能打乱 s 中字符出现的相对顺序。
- 要求三、在所有符合上一条要求的去重字符串中,字典序最小的作为最终结果。
上述三条要求中,要求三可能有点难理解,举个例子。
比如说输入字符串 s = “babc”,去重且符合相对位置的字符串有两个,分别是 “bac” 和 “abc”,但是我们的算法得返回 “abc”,因为它的字典序更小。
按理说,如果我们想要有序的结果,那就得对原字符串排序对吧,但是排序后就不能保证符合 s 中字符出现顺序了,这似乎是矛盾的。
现在我们只实现要求一和要求二
怎么实现呢?
class Solution {
public:
string removeDuplicateLetters(string s) {
std::stack<char> stk; // 存放去重的结果
// 布尔数组初始值为 false,记录栈中是否存在某个字符
// 输入字符均为 ASCII 字符,所以大小 256 够用了
std::vector<bool> inStack(256, false);
for(char c : s){
if(inStack[c]){
continue;
}
stk.push(c);
inStack[c] = true;
}
std::string sb;
while (!stk.empty()){
sb.insert(sb.begin(), stk.top()); stk.pop();
}
return sb;
}
};
此时已经满足要求一和要求二了,如果输入 s = “bcabc”,这个算法会返回 “bca”,已经符合要求一和要求二了,但是题目希望要的答案是 “abc” 对吧。
那我们想一想,如果想满足要求三,保证字典序,需要做些什么修改?
类似题目
- 去除重复字母(困难)
- 拼接最大数(困难)
- 去掉K位数字(中等)
- 不同字符的最小子序列(中等)
边栏推荐
- 必须指定GDAL API版本。提供一个路径使用GDAL_CONFIG gdal-config环境
- “error“: { “root_cause“: [{ “type“: “circuit_breaking_exception“, “reason“: “[parent] D [solved]
- Integer multiple series
- 阿里云天池大赛赛题(机器学习)——天猫用户重复购买预测(完整代码)
- Alibaba Cloud Tianchi Contest Question (Machine Learning) - Prediction of Industrial Steam Volume (Complete Code)
- npm package.json
- 串扰与防护
- 2022-08-08 mysql慢SQL-Q18-10GB数据量-mysql/innodb测试
- MySQL:redo log日志——笔记自用
- 单根k线图知识别以为自己都懂了
猜你喜欢
阿里云天池大赛赛题(机器学习)——工业蒸汽量预测(完整代码)
【OpenCV】-查找并绘制轮廓
2022年8月深圳产品经理认证招生简章(NPDP)
TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式
2022年起重机司机(限桥式起重机)考试题库及模拟考试
Talking about the process and how to create it
容易混淆的指针知识点
MySQL: redo log log - notes for personal use
JVM垃圾回收机制简介
Dingding conflicts with RStudio shortcuts--Dingding shortcut settings
随机推荐
做现货白银前这些要诀应先记起来
杰理之SD卡切回蓝牙没有作用【篇】
Ali YunTianChi competition problem (deep learning) - video enhancement (complete code)
Polygon zkEVM Prover
union
HyperLynx(四)差分传输线模型
MySQL: Intent Shared Locks and Intentional Exclusive Locks | Deadlocks | Lock Optimization
查询某时间段获得的积分总积分的大小进行排序
2022年低压电工练习题及模拟考试
Correct use of BaseDexClassLoader
【数学】点积与叉积
JVM垃圾回收机制简介
【服务器数据恢复】Ext4文件系统fsck后mount不上并报错的数据修复案例
2022-08-08 mysql慢SQL-Q18-10GB数据量-mysql/innodb测试
杰理之播歌曲前后音量大小不一样【篇】
浅谈进程与其创建方式
[Server data recovery] A case of data recovery when the Ext4 file system cannot be mounted and an error is reported after fsck
数量遗传学遗传力计算1:亲子回归方法
2022R1快开门式压力容器操作考试模拟100题及在线模拟考试
【二叉树】重建二叉树